1.在編譯c++文件是,編譯器先對其進行預處理,然後再編譯。預處理命令以#開頭,編譯器會修改#開頭的語句,然後把修改後的內容輸出,進行編譯
2.預處理僅僅是純文本替換,不會做上下文的檢查
3.宏函數。#define可以創建宏函數,並且能夠像函數那樣接受參數
#define twice(x) ((x)*2)
如果在程序中含有如下代碼
twice(2)
那麼最後會替換成 ((2)*2),結果就是4
宏還可以接受多個參數
#define max(x,y) ((x)>(y) ? (x):(y))
int x=5, y=7, z=0;
z=max(5,7);
最後z的值就是7
爲什麼我們在宏定義的時候使用了那麼多的看似沒用的括號。那是因爲宏函數在預處理的時候只是純文本替換,不會做正確性的檢測,那麼在程序中就會出現不可預知的問題。比如宏定義中是個加法運算,但是程序中調用了宏後,緊接着進行了乘法運算,那麼如果沒有括號進行約束,導致的結果就是先進行了後面的乘法運算,而後進行前面的加法運算,而不是我們的預期,先進行宏的加法,再進行後面的乘法
4.一個宏必須在同一行內定義完,如果宏比較大,那麼可能導致看起來比較吃力。所以c++提供了一個符號 \ ,用這個符號,可以進行換行管理
每調用一次宏,宏就會以內聯的方式展開在調用的地方,這樣會增加程序的內容,但是省去了函數調用的開銷
5.模版。模版是c++最強大但最少用的特性之一。模版可以讓程序員定義一種適用於不同類型對象的行爲
6.聲明模版
template <typename type>
type getmax(type value1, type value2)
{
if(value1>value2)
return value1;
else
return value2;
}
上面template 是聲明模版的關鍵字,typename 是定義一個類型。這個有使用模版的時候決定。下面的getmax是模版實現的函數。比如下面的調用:
int a = 3;
int b = 4;
int max = getmax<int>(a, b);
上面就是調用模版。getmax是這個模版,我們指定了裏面的typename 對應的type爲int。就相當與調用一個函數
int getmax(int value1, int value2)
{
if(value1>value2)
return value1;
else
return value2;
}
7.模版類
模版類和上面的模版函數差不多,就是定義了一種行爲,但是沒有指定其具體的類型:
template <typename t>
class tempclass
{
public:
void setv(t value){mvalue = value;}
t getvalue(){return mvalue;}
private:
t mvalue;
}
這樣,我們就可以用它來實例化一個類了。
tempclass <int> myclass;
myclass.setvalue(5);
tempclass<double> myclassd;
myclassd.setvalue(4.3);
8.我們可以爲模版指定默認的參數
template <typename t1=int, typename t2=int>
class myclass{};
這樣當我們在使用時就可以寫成
myclass<> a(4, 5);