c++ 構造函數的默認參數

問題

今天我寫了自己認爲完全沒有問題的代碼,下面貼出核心代碼:

//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文件,但兩者不一樣,會按着定義來。這就給類的使用者帶來了麻煩,因此,爲了避免這樣,帶默認參數的構造函數,默認參數只能出現在聲明中。

其實,不止是構造函數中出現這樣的問題,所有的函數,都應該這樣:聲明和定義的默認默認參數不共戴天 —— 不能同時都有,並且只能出現在聲明中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章