深度探索C++ 对象模型(3)-默认构造函数Default Constructor

1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作

2. 编译器构造Default Constructor 只在下面4种case:

  • 1.包含有带默认构造函数的对象成员的类 .
  • 2.继承自带有默认构造函数的基类的类 .
  • 3.有虚函数的类(需要初始化每一个class object的vptr) .
  • 4.有一个虚基类的类

本文主要针对"包含有带默认构造函数的对象成员的类"

	class Foo {
		public:
			Foo() { 
				cout << "Foo Constructor" << endl; 
			} 
			Foo(int) { 
			}
	};
  
	void test_defaultConstructor()
	{
		cout << "begin" << endl;
		Bar bar;
		cout << "end" << endl;
	}

(1). 若无定义构造函数

class Bar {  
		private: Foo foo; 
}; 

编译器的对类Bar的Default Constructor为

Bar::Bar(){
     foo.Foo::Foo();//调用Foo的构造函数来初始化foo对象
}

运行测试代码,输出结果为:
begin
Foo Constructor
end

(2). 若有构造函数

Bar::Bar()
{
    cout << "Bar default code" << endl; 
}

此时编译器扩展已知构造函数:

Bar::Bar(){
     foo.Foo::Foo();//调用Foo的构造函数来初始化foo对象
     cout << "Bar default code" << endl; 
}

运行测试代码,输出结果为:
begin
Foo Constructor
Bar default code
end

(3). 若有多个class member objects都要求constructor初始化,将按照在classs中的声明次序调用

	class Dopey {
		public:Dopey() {
			cout << "Dopey Constructor" << endl;
		}
	};

	class Sneezy {
		public:Sneezy() {
			cout << "Sneezy Constructor" << endl;
		}
	};

	class Bashful {
		public:Bashful() {
			cout << "Bashful Constructor" << endl;
		}
	};
	 

	class Snow_White { 
		private:
			Dopey dopey;
			Sneezy sneezy;
			Bashful bashful;
			int mumble; 
	};

	void test_defaultConstructor()
	{
		cout << "begin" << endl;
		Snow_White obj;
		cout << "end" << endl;
	}

运行测试代码,输出结果为:
begin
Dopey Constructor
Sneezy Constructor
Bashful Constructor
end

(4). 如果基类有默认构造函数,又有一个成员有默认构造函数,那么顺序是谁先呢?

	class SnowWhite : public Dopey{ 
	private: 
		Sneezy sneezy; 
	};

	void test_defaultConstructor_ObjectOrder()
	{
		cout << "begin" << endl;
		SnowWhite obj;
		cout << "end" << endl;
	}

运行测试代码,输出结果为:
begin
Dopey Constructor
Sneezy Constructor
end


【引用】
[1]<<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2] 代码地址 https://github.com/thefistlei/cplusStudy.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thefist11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值