构造函数语义学之Default Constructor构建操作
一、Default Constructor的构建操作
首先大家要走出两个误区:
1).任何class如果没有定义default constructor,就会被合成一个来。
2).便以其合成出来的default constructor 会明确设定“class”内每一个data member的默认值。
那么在什么情况下,编译器才会合成一个 default constructor呢?当编译器想要的时候,那么在什么情况下编译器会合成一个nontrival default constructor呢?有以下四种情况:
1)."带有Default Constructor"的Member Class object。
2)."带有Default Constructor"的 Base Class。
3)."带有一个 Virtual Fuction"的class。
如果说,以上两个比较容易理解的话,那这个恐怕不太好理解了。主要是因为带有virtual function 的类在编译期间会有隐含的发生两件事:
a).一个 virtual function table即vtbl会被编译器产生出来,内放 class 的 virtual functions 地址。
b).在每一个class object中,一个额外的 pointer member 会被编译器合成出来的,内含 class vtbl 的地址。
而以上两个扩张都需要通过合成的构造函数完成,所以……
4)."带有一个 Virtual Base Class"的class
这个不知道大家容不容易理解,我举个例子,先看这几个类:
class X { public: int i;};
class A: public virtual X{ public: int i;};
class B: public virtual X { public: int i;};
class C: public A, public B { public: int i;};
由于多重继承的原因,A和B都要虚继承 class X,这样就导致X成了virtual base class。那么为什么这种情况下会合成default constructor呢?原来在编译器处理A,B,C的时候都会给他们所包含的virtual base class(继承了嘛,所以他们都包含一份virtual base class)安插一个指针---用来指向virtual base class pointer table,这个表用来描述从继承类元素到虚基类元素的偏移量。这样经由reference 或 pointer访问(这里为什么强调经由reference或pointer访问?因为如果是通过值访问,那么这个类是直接知道virtual base class 元素所在位置的)virtual base class 的操作都可以通过相关指针来完成。
总之,以上四种情况会合成default constructor,那是因为这四种情况编译器有额外的、隐藏的工作要做!但仅此而已,编译器只会做他们该做的,他不会给你的nonstatic data member如整数、整数指针、证书数组得等做初始化。那不是他的工作范围,那是程序员应该做的!
构造函数语义学之Default Constructor构建操作的更多相关文章
- 构造函数语义学之Copy Constructor构建操作(2)
二.详述条件 3 和 4 那么好,我又要问大家了,条件1 和 2比较容易理解.因为member object或 base class 含有copy constructor.那么member objec ...
- 构造函数语义学之Copy Constructor构建操作(1)
一.Copy Constructor的构建操作 就像 default constructor 一样,如果class没有申明一个 copy constructor,就会隐含的声明或隐含的定义一个.生成的 ...
- 深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作
C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的 ...
- 构造函数语义学——Default Constructor篇
构造函数语义学--Default Constructor 篇 这一章原书主要分析了:编译器关于对象构造过程的干涉,即在对象构造这个过程中,编译器到底在背后做了什么 这一章的重点在于 default c ...
- C++对象模型——Default Constructor的建构操作(第二章)
第2章 构造函数语意学 (The Semantics of Constructor) 关于C++,最常听到的一个抱怨就是,编译器背着程序猿做了太多事情.Conversion运算符就是最常被引用的 ...
- C++对象模型(一):The Semantics of Constructors The Default Constructor (默认构造函数什么时候会被创建出来)
本文是 Inside The C++ Object Model, Chapter 2的部分读书笔记. C++ Annotated Reference Manual中明确告诉我们: default co ...
- 构造函数语义学——Copy Constructor 篇
构造函数语义学--Copy Constructor 篇 本文主要介绍<深度探索 C++对象模型>之<构造函数语义学>中的 Copy Constructor 构造函数的调用时机 ...
- The Semantics of Constructors: The Default Constructor (默认构造函数什么时候会被创建出来)
本文是 Inside The C++ Object Model, Chapter 2的部分读书笔记. C++ Annotated Reference Manual中明确告诉我们: default co ...
- Default Constructor的构造操作
Default Constructor的构造操作 C++ Annotated Reference Manual书中的Section 12.1说过:default constructor 只有在编译器需 ...
随机推荐
- 从创建webservice到发布webservice的一些相关总结
最近做了一个web服务,开始什么也不懂,就在网上到处找,对于刚毕业的我,感觉没用实际代码经过自己的手写出来,看什么都一头雾水,然后就看到很多人说webservice已经融入WCF..然后就先创建了WC ...
- 高性能动画!HTML5 Canvas JavaScript框架KineticJS
高性能动画!HTML5 Canvas JavaScript框架KineticJS KineticJS是一款开源的HTML5 Canvas JavaScript框架,能为桌面和移动应用提供高性能动画,并 ...
- php获得访问来源(手机wap访问、电脑web访问)
为了更好的用户体验,本主题默认支持wap和web两种访问样式,wap访问将不包含任何脚本.样式也是重新撰写,不支持更多页面,只支持首页.详情页, 评论框.登录等内容将陆续更新到wap内容里.如果想测试 ...
- (转)Smarty Foreach 使用说明
foreach 是除 section 之外处理循环的另一种方案(根据不同需要选择不同的方案). foreach 用于处理简单数组(数组中的元素的类型一致),它的格式比 section 简单许多,缺点是 ...
- springMVC -- 整合UEditor(富文本编辑器)
工作中需要用到UEditor编辑文本,在与springMVC进行整合时,出现了一些问题,结果导致,在进行图片上传时出现如下提示: 上网查询了很多相关资料,此处简要记录下,防止以后遇到类似问题. 一种方 ...
- UILabel的高度自适应
_content = [UILabel new]; _content.text = @"日落时分,沏上一杯山茶,听一曲意境空远的<禅>,心神随此天籁,沉溺于玄妙的幻境里.仿佛我就 ...
- 10集合:List<T>,Dictionary<K,V>
List<T>泛型集合 List<T>是C#中一种快捷.易于使用的泛型集合类型,使用泛型编程为编写面向对象程序增加了极大的效率和灵活性. 1.List<T>用法 ...
- Java反射与代理
Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC.AOP就是通过反射机制与动态代理实现的. 1 Java反射 示例: User user = new User( ...
- CSS的inherit与auto使用分析
一个很显浅的寓言,千年老树,电打雷劈,屹立不倒,却毁于蝼蚁的侵袭之下.自以为精通CSS的人,常常被一些小问题搞到头晕脑胀. 通常是一个很小的数值,经过层层放大歪曲后,整个布局就走形了.CSS是一门很简 ...
- Android 学习手札(备注)
1.在Android 应用程序中不能使用System.out.println(..)来输出信息,而要使用Log类中的静态方法输出调试信息. Log.d("onStart", &qu ...