第15章 宏和模版

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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章