C Primer 複習雜記(第七章)

2021-07-04 21:03:18 字數 2351 閱讀 6554

不適合複製實參的情況包括:

通常,陣列以非引用型別傳遞,此時陣列會轉換為指向第乙個元素的指標,形參中陣列大小並沒有意義。然而如果形參是陣列的引用,則編譯器不會將陣列實參轉化為指標,而是傳遞陣列引用本身。此時陣列大小會由編譯器進行檢查。

例:

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);其可行函式為:

void f(int, int);                       //(1)

void f(double, double = 3.14); //(2)

對於(1),其第二個實參的匹配劣於(2),對於(2),其第乙個實參的匹配劣於(1)。故具有二義性,呼叫錯誤。

再*注:型別提公升優於標準轉換

考慮

void func(int);

void func(short);

func('a');

char->int

//型別提公升

char->short

//型別轉換

故實際呼叫為void func(int);

呼叫乙個引用形參的函式時,傳遞乙個右值或傳遞乙個需要轉換型別的物件是不允許的。例如:

int incr(int &val)

int main()

令人吃(dan)驚(teng)的是,儘管函式的形參是const,但是編譯器卻將func的定義視為其形參被宣告為普通的int型:

void func(const

int i)

void func(int i)

error c2084: 函式「void func(const

int)」已有主體

這種用法是為了支援對c語言的相容,因為在c語言中,具有const形參或非const形參的函式並無區別。

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指向常量型別 編譯器首先編譯成員的宣告,然後才輪到...