不適合複製實參的情況包括:
通常,陣列以非引用型別傳遞,此時陣列會轉換為指向第乙個元素的指標,形參中陣列大小並沒有意義。然而如果形參是陣列的引用,則編譯器不會將陣列實參轉化為指標,而是傳遞陣列引用本身。此時陣列大小會由編譯器進行檢查。
例:
考慮如下四個函式和某次呼叫:void printvalues(int (&arr)[10]){}
int main()
; int k[10] = ;
printvalues(&i); //error
printvalues(j); //error
printvalues(k); //ok
return
0;}
void f();
void f(int);
void f(int, int);
void f(double, double = 3.14);
f(5.6); //it calls f(double, double)
確定候選函式:
即確定所有過載函式集合,在集合中的函式均為候選函式,本例中即為四個f函式。
選擇可行函式:
即從所有候選函式中,選擇乙個或多個能夠用本次函式呼叫中的實參來呼叫的函式。其必須滿足兩個條件:
函式形參個數與呼叫的實參相同。
每個實參型別和對應形參型別相匹配,或者可被隱式型別轉換為對應形參。
本例中的可行函式為:
void f(int);
void f(double, double = 3.14);
尋找最佳匹配(如果有)
即在可行函式中尋找對應形參與實參最匹配的乙個。
如果有且僅有乙個函式滿足下列條件,則匹配成功:
該函式每個實參的匹配都不劣於其他可行函式需要的匹配。
該函式有乙個實參匹配優於其他可行函式提供的匹配。
潛在內容:需要型別轉換的匹配劣與精確匹配。
如f(5.6);
中,若呼叫
void f(int);
意味著有乙個實參需要隱式型別轉換
如呼叫
void f(double, double = 3.14);
則每乙個實參的匹配都不需要隱式型別轉換。
故該函式:
每個實參的匹配都不劣與 void f(int);。
第乙個實參的匹配為精確匹配,優於void f(int);的第乙個引數。
故最佳匹配為
void f(double, double = 3.14);
*注:若呼叫函式f(42,1.2);
其可行函式為:
對於(1),其第二個實參的匹配劣於(2),對於(2),其第乙個實參的匹配劣於(1)。故具有二義性,呼叫錯誤。void f(int, int); //(1)
void f(double, double = 3.14); //(2)
再*注:型別提公升優於標準轉換
考慮
故實際呼叫為void func(int);
void func(short);
func('a');
char->int
//型別提公升
char->short
//型別轉換
void func(int);
呼叫乙個引用形參的函式時,傳遞乙個右值或傳遞乙個需要轉換型別的物件是不允許的。例如:
令人吃(dan)驚(teng)的是,儘管函式的形參是const,但是編譯器卻將func的定義視為其形參被宣告為普通的int型:int incr(int &val)
int main()
這種用法是為了支援對c語言的相容,因為在c語言中,具有const形參或非const形參的函式並無區別。void func(const
int i)
void func(int i)
error c2084: 函式「void func(const
int)」已有主體
int *&v1;
printvalues(int (*matrix)[10], int rowsize);
c primer 第七章 類
const更大的作用是可以修飾函式的引數,返回值,定義體。1.用const 修飾函式的引數 如果引數作輸出用,不論它是什麼資料型別,也不論它採用 指標傳遞 還是 引用傳遞 都不能加const修飾,否則該引數將失去輸出功能。const 只能修飾輸入引數 如果輸入引數採用 指標傳遞 那麼加const修飾...
C Primer 筆記(第七章)
函式可以看作程式設計師定義的操作。與內建操作符類似,每個函式都會實現一系列的計算,然後生成乙個計算結果,不同的是,函式有自己的函式名,而且運算元的個數沒有限制。函式的定義 形式 返回型別 函式名 形參列表 引數傳遞 引用實參 void swap int v1,int v2 引用形參直接關聯其所繫結的...
C Primer 第七章 類
成員函式 宣告在類內,定義可內可外,定義在類內則是隱式內聯函式 在成員函式內部,可以直接使用呼叫該函式的物件的成員 類外部定義的成員的名字必須包含所屬類名 this本身是乙個常量指標,預設情況下指向非常量版本 在引數列表後加const可以修改this指向常量型別 編譯器首先編譯成員的宣告,然後才輪到...