默认构造函数学习

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

 

posted @ 2024-04-21 22:18  lypbendlf  阅读(1)  评论(0编辑  收藏  举报