目錄
第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;