300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 深度探索C++ 对象模型(3)-默认构造函数Default Constructor

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

时间:2024-07-09 04:10:18

相关推荐

深度探索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] 代码地址 /thefistlei/cplusStudy.git

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。