天天看點

c++primer plus 6 讀書筆記 第八章 函數探幽0

目錄

​​第8章 函數探幽​​

​​8.1 C++内聯函數(提高簡單函數的效率)​​

​​8.2 引用變量​​

​​8.2.1 建立引用變量​​

​​8.2.2 将引用用作函數參數​​

​​8.2.3引用的屬性和特别之處​​

​​8.2.4 将引用用于結構​​

​​8.2.5 将引用用于類對象​​

​​8.2.6 對象、繼承和引用​​

​​8.2.7 何時使用引用參數​​

​​8.3 預設參數​​

​​8.4 函數重載​​

​​8.4.1 重載示例​​

​​8.4.2 何時使用函數重載​​

​​8.5 函數模闆​​

​​8.5.1 重載的模闆​​

​​8.5.2模闆的局限性​​

​​8.5.3 顯式具體化​​

​​8.5.4 執行個體化和具體化​​

​​8.5.5 編譯器選擇使用哪個函數版本​​

​​8.5.6 模闆函數的發展​​

第8章 函數探幽

8.1 C++内聯函數(提高簡單函數的效率)

在函數聲明和定義前加關鍵字 inline

E:

inline double square(double x){ return x*x;}

8.2 引用變量

引用是已定義變量的别名,

引用變量主要用作函數形參,使用引用變量做參數,函數将使用原始資料。為函數處理大型結構提供友善。

8.2.1 建立引用變量

C++使用 & 來聲明引用。

int rats;

int & rodents = rats;  //必須在聲明引用變量時進行初始化。

8.2.2 将引用用作函數參數

8.2.3引用的屬性和特别之處

盡可能使用const

8.2.4 将引用用于結構

引用主要就是為了用于結構和類。

假設一個結構struct free_throws,

可以這樣編寫函數原型:

void set_pc(free_throws & ft); //如果不希望修改結構,加上字首const.

8.2.5 将引用用于類對象

C++通常使用引用将對象傳遞給函數

8.2.6 對象、繼承和引用

基類引用可以指向派生類。

8.2.7 何時使用引用參數

使用引用的主要原因有兩個:

1. 修改調用函數中的資料對象

2. 通過引用傳遞而不是整個資料對象,提高程式運作速度。

8.3 預設參數

預設參數指函數調用時省略實參時自動使用的預設值。

指派給函數原型的參數即可設定預設參數。(必須從右往左添加預設值)

E: char* left(const char *str, int n=1);

8.4 函數重載

函數重載允許多個同名函數。

重載的根據是函數的參數清單。

8.4.1 重載示例

8.4.2 何時使用函數重載

僅當函數基本上執行相同的任務,但是使用不同形式的資料時,才使用函數重載。

8.5 函數模闆

函數模闆是通用的函數描述,也就是說,它們使用泛型來定義函數。

其中,泛型可以被具體類型替換。

E:

template <typename AnyType> //template,建立模闆。

//typename 可以使用class替換

//AnyType 類型名 可以任意選擇。

void Swap(AnyType &a, AnyType &b)

{

AnyType temp;

temp =a;

a =b;

b = temp;

}

8.5.1 重載的模闆

模闆的參數特征标不同即可重載。

8.5.2模闆的局限性

可能無法處理默寫類型。可以為特定類型提供具體化模闆。

8.5.3 顯式具體化

C++98方法:

對于給定的函數名,可以有非模闆函數,模闆函數和顯式具體化函數以及它們的重載版本。

顯示具體化的原型和定義以template<>打頭,通過名稱指出類型。

具體化優先于正常模闆。非模闆優先于模闆。

8.5.4 執行個體化和具體化

8.5.5 編譯器選擇使用哪個函數版本

8.5.6 模闆函數的發展

C++11新增關鍵字decltype

用于确定類型。

decltype(expression) var;

var與expresssion類型相同/函數傳回值/...

C++11後置傳回類型

double h(int x, float y)

auto h(int x, float y) ->double; //c++11後置傳回類型

結合後置傳回類型,可以給(模闆)指定傳回類型。

template<class T1,class T2>

auto gt(T1 x,T2 y) ->decltype(x +y)

{

...

return x+y;