C++默认构造函数

什么是默认构造函数

默认构造函数(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;
} 

什么情况下不会生成公有的默认构造函数

  • 当一个类显式声明了任何的构造函数,都会导致不生成公有的默认构造函数
  • 当一个类的默认构造函数被声明为非公有的时候

默认构造函数何时生成

  1. 含有对象成员,且该对象成员有一个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. 当存在虚基类时,且该虚基类不存在构造函数时,会生成默认构造函数以初始化虚基类表

默认构造函数都做了什么

默认构造函数并不负责初始化类里面的成员,默认构造函数只是调用了基类或者成员的默认构造函数,或者为含有虚函数的对象初始化虚函数指针和虚表

参考文档:
什么是默认构造函数?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值