問題
今天我寫了自己認爲完全沒有問題的代碼,下面貼出核心代碼:
//A.h
class A
{
public:
A(int a = 1, int b = 3); //聲明構造函數
private:
int a;
int b;
};
//A.cpp
#include "A.h"
A::A(int a = 1, int b = 3) : a(a), b(b){} //定義構造函數
//main.cpp
#include "A.h"
int main()
{
A *a = new A();
return 0
}
在編譯的時候出現了下面的報錯信息:
error: default argument given for parameter 2 of ‘A::A(int a = 1, int b = 3)’ [-fpermissive]
error: after previous specification in ‘A::A(int a = 1, int b = 3)’ [-fpermissive]
將聲明時的構造函數中的默認參數刪除後重新編譯
//A.h
class A
{
public:
A(int a, int b); //聲明構造函數
private:
int a;
int b;
};
出現如下錯誤:
error: no matching function for call to ‘A::A()’
最後在聲明構造函數時保留默認的參數,把定義構造函數時的默認參數刪除。編譯運行正常。最終代碼如下:
//A.h
class A
{
public:
A(int a = 1, int b = 3); //聲明構造函數
private:
int a;
int b;
};
//A.cpp
#include "A.h"
A::A(int a = 1, int b) : a(a), b(b){} //定義構造函數
//main.cpp
#include "A.h"
int main()
{
A *a = new A();
return 0
}
解釋
我認爲這樣設計的目的是:如果聲明給定了一個參數了,但是定義時又給定了一個不同的參數。這樣,用戶看到的是類的聲明.h文件,但兩者不一樣,會按着定義來。這就給類的使用者帶來了麻煩,因此,爲了避免這樣,帶默認參數的構造函數,默認參數只能出現在聲明中。
其實,不止是構造函數中出現這樣的問題,所有的函數,都應該這樣:聲明和定義的默認默認參數不共戴天 —— 不能同時都有,並且只能出現在聲明中。