构造函数语义学之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 只有在编译器需 ...
随机推荐
- 【网络通信】服务器端Socket监听80端口,建立连接传输数据时也是使用的80端口么?
1. 服务器端Socket监听80端口,建立连接传输数据时也是使用的80端口么? 答:对.建立连接时服务器会分配一个新的Socket,但是用的源端口号还是80端口.套接字是由协议类型.源IP.目的IP ...
- PL/SQL 触发器简介
与公司同事交流了一下,得知触发器很少用.性能是一方面,主要是如果用太多触发器,可能到时你都不知道会有什么操作自动发生. 有些操作可以在程序中控制.例如在插入某个表时,写个log表的记录.这可以用触发器 ...
- Java_Activiti5_菜鸟也来学Activiti5工作流_之与Spring集成(三)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- php_curl扩展在WINDOWS2003上如何添加
一.使用星外PHP安装后 二.修改环境变量,PATH: c:\php;c:\php\ext;%SystemRoot%\system32;
- (whh仅供自己参考)进行ip网络请求的步骤
这个过程大致是这个样子: 1 添加通知 2 发送网络请求 里边有一个发送通知的操作 3 执行发送通知的具体操作 代码如下: 1 在VC添加通知 [[NSNotificationCenter defau ...
- [中级] 有效删除URL中的index.php
如果你刚接触CI不久又或者刚刚研读CI的使用手册的话,关于如何有效删除URL中index.php以使URL看起来更友好美观的问题,可能是你面对的第一个较为复杂的问题!本贴不是原创,而是一个各种意见的综 ...
- php利用smtp类轻松的发送电子邮件
当你还在纠结php内置的mail()函数不能发送邮件时,那么你现在很幸运,此时的这篇文章可以帮助到你! php利用smtp类来发邮件真是屡试不爽,我用过很久了,基本上没出过问题.本博客后台,当博主回复 ...
- JAVA开发环境 - 环境变量及配置
JDK是什么?JRE是什么? JRE(Java Runtime Environment):Java运行环境: JDK(Java Development Kit):Java开发工具包,里面已经包含JRE ...
- java_设计模式_装饰者模式_Decorator Pattern(2016-07-28)
装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户 ...
- Sqoop import加载HBase案例详解
简单写一下如何将订单表sqoop到hbase表中的步骤. 下表: 1.通过hbase shell 打开hbase. 2.创建一个hbase表 create 'so','o' 3.将so表的数据导入到h ...