什么是默认构造函数
默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化时就会使用默认构造函数。【百度百科】
#include <iostream>
#include <string>
typedef unsigned int uint;
using namespace std;
class Person{
public:
Person(uint myage=18, string myname="hhh")
{
age=myage;
name=myname;
cout<<"ctor of Person!"<<endl;
}
uint age;
string name;
};
int main(int argc, char** argv){
Person a;//调用带有默认参数的默认构造函数
cout<<a.age;
return 0;
}
什么情况下不会生成公有的默认构造函数
- 当一个类显式声明了任何的构造函数,都会导致不生成公有的默认构造函数
- 当一个类的默认构造函数被声明为非公有的时候
默认构造函数何时生成
- 含有对象成员,且该对象成员有一个nontrivial 默认构造函数
#include <iostream>
#include <string>
typedef unsigned int uint;
using namespace std;
class Feature{
public:
Feature()
{
cout<<"ctor of Feature!"<<endl;
}
uint hight;
uint weight;
};
class Person{
public:
Person(uint myage=18, string myname="hhh")
{
age=myage;
name=myname;
cout<<"ctor of Person!"<<endl;
}
Feature fea;
uint age;
string name;
};
int main(int argc, char** argv){
Person a;
return 0;
}
输出:
2. 如果该类的基类有nontrivial 默认构造函数,编译器也会为这个派生类生成默认构造函数
#include <iostream>
#include <string>
typedef unsigned int uint;
using namespace std;
class Person{
public:
Person(uint myage=18, string myname="hhh")
{
age=myage;
name=myname;
cout<<"ctor of Person!"<<endl;
}
uint age;
string name;
};
class Student: public Person{
public:
uint stu_id;
};
int main(int argc, char** argv){
Student a;
cout<<a.age;
return 0;
}
输出:
3. 类中存在虚函数的时候,如果没有提供构造函数,也会合成默认构造函数,以初始化虚函数表vftable。若有其他的构造函数,会在该构造函数前插入代码以完成相应工作
4. 当存在虚基类时,且该虚基类不存在构造函数时,会生成默认构造函数以初始化虚基类表
默认构造函数都做了什么
默认构造函数并不负责初始化类里面的成员,默认构造函数只是调用了基类或者成员的默认构造函数,或者为含有虚函数的对象初始化虚函数指针和虚表
参考文档:
什么是默认构造函数?