C++const類型的引用參數


  • 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類型,否則也會出錯

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM