天天看點

C++頭檔案的一些筆記頭檔案

頂層作用域:

頂層作用域就是從聲明點延伸到源程式文本結束

命名空間:

如果整個檔案都是一個命名空間,直接在頭部using就可以,比如常用的

using namespace std;
           

如果是局部使用這個命名空間的話是

namespace std {
    ...
}
           

頭檔案

首先規範應該是:

頭檔案(a.h):聲明函數或者類

與頭檔案命名相同(沒有必要,但是為了規範)的cpp檔案(a.cpp):頭檔案中聲明的函數的實作 (該cpp的頭部要include頭檔案)

自己的代碼(b.cpp)使用頭檔案的時候,直接include頭檔案

編譯的時候:

編譯時連結a.h和a.cpp(為什麼說是連結呢?因為函數的實作是在a.cpp,但是自己的代碼隻包含了a.h)

舉個例子:

隻有函數的頭檔案:

Car.h:

#include <iostream> //為了實作函數的時候cout會用到
void print();
           

Car.cpp:

#include "Car.h"
using namespace std;
void print () {
    cout << "123\n";
}
           

Test.cpp:

# include "car.h"
using namespace std;

//void print();     

int main() {
    print();
    cout << "end" << endl;
}
           

基本用法如上;

注意的是,我在Car.h裡面include了iostream,是以我的Car.cpp裡可以直接用cout, 同理,在Test.cpp裡也可以直接用;

但是我們自己寫代碼會習慣性的加上

會不會重複呢?

同樣我們去看看源碼,路徑:

是不是看到了開頭兩行和最後一行是:

#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM 1
...
...
...
#endif /* _GLIBCXX_IOSTREAM */
           

_GLIBCXX_IOSTREAM僅作為辨別符,沒有實際意義;

如果我們在定義頭檔案的時候也在頭和尾加上這樣的辨別,那就不怕重複包含了,是以我們自己加上iostream也無所謂;比如說剛剛的a.h可以這樣定義:

#ifndef TEST
#define TEST

#include <iostream>
void print();

#endif

           

然後上述的Test.cpp裡的第4行的注釋,如果我想要重複聲明一次這個函數可以嗎?結果是可以的,但是隻能是類外的函數,因為類函數隻能在類内聲明

;但是所有的函數隻能定義一次(不是重載)

類頭檔案:

舉個例子:

Car.h:

class Car {
    private:
        int size;
        int price;
    public:
        Car(int, int);
        Car();
        int getSize();
        int getPrice();
};


           

Car.cpp:

#include "Car.h"

Car::Car(){}

Car::Car(int s, int p) {
    this->size = s;
    this->price = p;
}

int Car::getSize() {
    return this->size;
}

int Car::getPrice() {
    return this->price;
}
           

Test.cpp:

# include <iostream>
# include "car.h"
using namespace std;

int main() {
    Car a(, );
    cout << a.getSize() << endl;
}
           

類比一下,其實也不難吧~

繼續閱讀