頂層作用域:
頂層作用域就是從聲明點延伸到源程式文本結束
命名空間:
如果整個檔案都是一個命名空間,直接在頭部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;
}
類比一下,其實也不難吧~