標籤:ring 自動 const add c++ image 參數不匹配 情況 font
- 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類型,否則也會出錯
C++const類型的引用參數