- string類定義了一種char*到string的轉換功能,這使得可以使用C-風格字符串來初始化string對象。
- 類型為const引用的形參其中一個屬性表明:假設實參的參數類型與引用參數不匹配,但可以轉換為引用類型,程序將創建一個正確類型的臨時變量,使用轉換后的實參值來初始化它,然后傳遞一個指向該臨時變量的引用。
- 上面提到const引用為形參的屬性,也就是說,如果引用的參數是const,則編譯器在某些情況下會生成臨時變量,比如下面這兩種情況:
1, 實參類型不正確,但可以轉換為正確類型。
2, 實參類型正確,但不是左值
先看到下面例子
void g(string &a,const string &b) { cout<<"a address :"<<&a<<endl; cout<<"b address :"<<&b<<endl; // return a; } string f() { } int main() { string input="I love you"; int a=1; // int b=2; cout<< "input address: "<<&input<<endl; const char *b="***"; cout<<"b address: "<<&b<<endl; g(input,b); // g(input,input); getchar(); return 0; }
可以看到g函數的參數一個為string& 一個為 const string&
我們將input="I love you"和const char *b="***";作為參數傳入g函數,分別打印傳入前和傳入后變量的地址我們來看一下結果。
可以看到將字符串常量傳給g函數的const string&參數打印出的地址與傳入的地址不同,這說明函數自動生成了一個臨時變量將字符串常量自動轉化為string類型。
那我們再看另一個例子
1 string f(); 2 string g(string & str); 3 4 g(f()); 5 g("abc");
程序編譯在4,5行出錯,這是為什么呢。
第5行的錯誤可以由上面的例子解釋,當引用參數與實參不匹配,但可以通過轉化為引用類型時,要將引用聲明為const。
第4行的錯誤可以知道,將一個臨時變量作為實參傳遞給參數時,也同樣需要將參數類型設為const。
以上是針對string類型的參數做的實驗,那么其他類型的參數是不是也同樣是這樣的規則呢?
1 void g(int &a,const char &b) 2 { 3 cout<<"a address :"<<&a<<endl; 4 cout<<"b address :"<<&b<<endl; 5 6 // return a; 7 } 8 9 string f() 10 { 11 } 12 int main() 13 { 14 15 int a=1; 16 int b=2; 17 cout<< "a address: "<<&a<<endl; 18 cout<<"b address: "<<&b<<endl; 19 20 g(a,b); 21 22 // g(input,input); 23 24 getchar(); 25 return 0; 26 }
我們將參數參數改為int& 和 const char&引用,將兩個整形變量傳遞給函數。發現結果和上面一樣,同樣產生了臨時變量。
總結
在c++中當函數參數為引用時。
- 如果傳遞的實參與函數參數類型不匹配,那么只有將參數類型定義為const,那函數將會產生一個臨時變量,臨時變量自動轉化為函數參數類型。否者將報錯。
- 如果傳遞的實參是一個臨時變量,那么就要將函數參數定義為const類型,否則也會出錯