轉自:https://blog.csdn.net/sevenjoin/article/details/88314531,講的很好。
1.介紹
若針對一個類沒有顯式地定義建構函式,那麼編譯器會隱式的為這個類生成一個預設構造成員函式。 預設建構函式就是在呼叫時不需要顯示地傳入實參的建構函式。
假如使用者定義了其他建構函式(比如有引數的,或者引數不同的),那麼編譯器無論如何就不會再合成預設的建構函式了。
派生類和基類的關係,呼叫派生類的自定義的建構函式的時候,派生類會自動呼叫基類中的預設建構函式,而不能呼叫基類中的其他建構函式(除非在派生類的建構函式序列初始化的時候指明基類的建構函式,否則將會自動呼叫基類預設建構函式)
下面這段程式碼,編譯有問題:
class Foo {
public:
// Foo(){};
// Foo() = default;// 讓編譯器生成一個預設的無參建構函式;可以讓使用者一眼就看出這是一個合成版本的建構函式,沒有其他功能。int val; Foo(int i):val(i){} }; class Bar:public Foo { public: char *str; int i; Bar(int i,char*s){ i=i; str=s; } };
編譯報錯:
./seqid.cpp:75:20: error: no matching function for call to ‘Foo::Foo()’ Bar(int i,char*s){ ^ ./seqid.cpp:68:3: note: candidate: Foo::Foo(int) Foo(int i):val(i){} ^ ./seqid.cpp:68:3: note: candidate expects 1 argument, 0 provided ./seqid.cpp:64:7: note: candidate: constexpr Foo::Foo(const Foo&) class Foo
可以把註釋部分去掉一個,就可以了。或者Bar建構函式時顯式呼叫:
Bar(int i,char*s):Foo(10){ i=i; str=s; }