转自: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; }
标签:Bar,int,默认,学习,基类,Foo,构造函数 From: https://www.cnblogs.com/BlueBlueSea/p/18149625