預設建構函式學習

lypbendlf發表於2024-04-21

轉自: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;
  }

相關文章