大家都知道當我們聲明一個類時,系統會提供一個默認構造函數。當我們需要提供參數進行對類數據成員進行初始化時,就需要對類的帶參構造函數進行重載。同時,如果我們需要調用默認構造函數進行類數據成員的初始化時,還需要對類的默認構造函數進行重載。也許就在這一塊,我們很多人都遇到過同樣的錯誤:
當我們給出一個帶默認參數的構造函數,並且重載一個默認構造函數,當我們定義一個類對象時,如果不傳遞參數,會出現二義性錯誤。因為我們沒有傳遞參數時,系統默認又兩種選擇,一種是調用默認構造函數,另一種是調用帶參構造函數並傳遞默認參數。
如下
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();