构造函数语义学之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 只有在编译器需 ...
随机推荐
- git 删除远程master 分支
➜ fekit-extension-yo git:(dev) git push origin :master remote: error: By default, deleting the curr ...
- Json字符串与字典互转
#pragma mark 转换json字符串 +(NSString *)toJSON:(id)aParam { NSData *jsonData=[NSJSONSerialization data ...
- Eclipse / Android : “Errors running builder 'Android Pre Compiler' on project…”
Errors occurred during the build. Errors running builder 'Android Resource Manager' on project 'hell ...
- C#生成验证码实例
常用生成验证码实例封装: /// <summary> /// 生成内存位图 /// </summary> /// <param name="Code" ...
- HBuilder+移动APP开发实例
mui: 官网:http://dcloudio.github.io/mui/ 说明:一般要把官网内容通读一遍,这是开发的基础 开始 1.新建项目 在首页点击新建移动App,如下: 或者在项目管理器内右 ...
- Sqlserver通过链接服务器访问Oracle
工作中遇到的情况,win 7 64位操作系统的就安装64位的oracle 客户端,然后重启sql service服务后再创建sql 链接服务器.关于如何创建链接服务器请查看下面的大神的链接: http ...
- dnw for linux: Ubuntu下可用,无需编译驱动,mini2440可用
1.安装所需库文件 sudo apt-get install libusb-dev 2.源代码如下 /* dnw2 linux main file. This depends on libusb. * ...
- How to Make LastPass Even More Secure with Google Authenticator
Google Authenticator LastPass supports Google Authenticator, which is officially available as an app ...
- 类和ID选择器的区别
学习了类选择器和ID选择器,我们会发现他们之间有很多的相似处,是不是两者可以通用呢?我们不要着急先来总结一下他们的相同点和不同点: 相同点:可以应用于任何元素不同点: 1.ID选择器只能在文档中使用一 ...
- jQuery实现的向下推送图文信息滚动效果
HTML 我们以新浪微博信息滚动为背景,html中包含了多条微博图文信息,结构如下: <div id="con"> <ul> <li> < ...