C++構造函數重載以及默認參數引起的二義性


    大家都知道當我們聲明一個類時,系統會提供一個默認構造函數。當我們需要提供參數進行對類數據成員進行初始化時,就需要對類的帶參構造函數進行重載。同時,如果我們需要調用默認構造函數進行類數據成員的初始化時,還需要對類的默認構造函數進行重載。也許就在這一塊,我們很多人都遇到過同樣的錯誤:

    當我們給出一個帶默認參數的構造函數,並且重載一個默認構造函數,當我們定義一個類對象時,如果不傳遞參數,會出現二義性錯誤。因為我們沒有傳遞參數時,系統默認又兩種選擇,一種是調用默認構造函數,另一種是調用帶參構造函數並傳遞默認參數。

如下

 1 class Complex  
 2 {  
 3 private:  
 4     float real, imag;  
 5 public:  
 6     Complex()  
 7     {  
 8         real = 0;  
 9         imag = 0;  
10     }  
11       
12     Complex(float r = 0, float i = 0)  
13     {  
14         real = r;  
15         imag = i;  
16     }  
17 };  
18 int main()  
19 {  
20         Complex c;//error: call of overloaded ‘Complex()’ is ambiguous  
21   
22         return 0;  
23 }  

在編譯的時候出現錯誤:

1 <span style="color:#FF0000;">error: call of overloaded ‘Complex()’ is ambiguous</span>  

對此,有一下兩種解決方法

1.去掉默認構造函數。

 1 class Complex  
 2 {  
 3 private:  
 4     float real, imag;  
 5 public:  
 6     Complex(float r = 0, float i = 0)  
 7     {  
 8         real = r;  
 9         imag = i;  
10     }  
11 }; 

這時,當我們不給構造函數傳遞參數時,系統會傳遞默認參數以對類數據成員進行初始化。

Complex c;

相當於

Complex c(0,0);

2.去掉帶參構造函數的默認參數

 1 class Complex  
 2 {  
 3 private:  
 4     float real, imag;  
 5 public:  
 6     Complex()  
 7     {  
 8         real = 0;  
 9         imag = 0;  
10     }  
11       
12     Complex(float r, float i)  
13     {  
14         real = r;  
15         imag = i;  
16     }  
17 };  

Complexc;

相當於

Complex c();


免責聲明!

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



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