您的位置:首页 > 编程语言 > C语言/C++

深度搜索C++对象模型2.2 构造函数语义学-Default Constructor的构造操作

2014-07-19 10:34 274 查看
implicit 暗中的; explicit 显式的; trivial 没用的; nontrivial 有用的;

1 任何class 如果没有定义Default Constructor ,就会被合成出来一个吗? 答案:不是

2 编译器合成出来的Default Constructor 会初始化你的成员变量?不会,你自己试试。

具体解析看下面的:


默认构造函数(Default Constructor)的产生是一定的吗?

不是的

那默认构造函数在什么时候产生了?

在编译器需要的时候产生,注意不是在程序需要的时候:

例如 class A{ int a}; A b;count<<b.a ;发现是乱码,不是你以为的0(编译器没合成默认构造函数 来初始化你的a 需要程序员自己动手)

下面就讨论4种情况下编译器如何产生默认构造函数,以及他们是如何被编译器所需要的。

情况1:“带有Default Constructor " 的 Member Class Object(通俗介绍:class A { A()}; class B { A a;int r};就是B类有个成员类A 而A有缺省构造函数 ,这种情况B会合成缺省构造函数。

1 B会合成函数 B(){ a.A()}; 这满足编译器的需求: B合成 Default Constructor 目的是调用成员对象A 的Default Constructor的。 但是没有满足程序员的要求:成员r 谁来初始化。

2 针对上面那种未能满足程序员的要求,所有程序员需要自己合成,B ::B(){r=0;} 问题出来了…………有了显示的构造函数编译器就不会合成缺省构造函数了,那如何满足编译器的要求呢?不要急,编译器会在程序员自己的构造函数中插入相关代码 编译器看到代码是 B::B(){ a.A(); r=0} 如果有多个类成员,将按照申明的顺序调用其构造函数,记住:这些调用都是发生在初始化r 前面。

情况2:“带有Default Constructor " 的 Base Class (通俗介绍:class A { A()}; class B::A{int r}就是B类继承的基类A有缺省构造函数 ,这种情况B会合成缺省构造函数。

类似于情况1 ,需要派生类合成构造函数去调用基类的构造函数。这里就不再赘述了。

情况3:”带有一 个virtual Funtion ” 的class (通俗介绍:1 class B{virtual void fun();};就是B类有虚函数,这种情况B会合成缺省构造函数。 2 其基类有虚函数也会合成

原因:1 在有虚函数的情况下,会有虚函数表被编译器产生,虚函数表里面有虚函数地址

2 在每一个class object 中,一个额外的虚函数指针 vptr被产生,里面含有虚函数表的地址

所有每一个类会在没有构造函数的情况下合成一个缺省构造函数来初始化vptr(虚函数表的指针)

情况4:”带有一 个virtual Base class ” 的class(通俗介绍:class A{}; 1 class B::virtual A{};就是B类虚继承基类A,这种情况B会合成缺省构造函数。

首先理解为什么要有 virtual 继承这个机制:推荐看这个虚基类的机制

结合上面的机制,你会发现其实他们共有同一个基类,但是无法知道实际调用的对象是哪个,导致调用时 无法知道哪个指针(构造函数会合成一个虚基类指针指向基类)的偏移量,所以无法确定其位置。所以编译器会在构造期合成一个指针,在合成的构造函数里面安插哪些“允许每一个virtual base class ”的执行期存取操作的代码。

感觉第四种情况没说明白,忘大神指点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: