一、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构建操作的更多相关文章

  1. 构造函数语义学之Copy Constructor构建操作(2)

    二.详述条件 3 和 4 那么好,我又要问大家了,条件1 和 2比较容易理解.因为member object或 base class 含有copy constructor.那么member objec ...

  2. 构造函数语义学之Copy Constructor构建操作(1)

    一.Copy Constructor的构建操作 就像 default constructor 一样,如果class没有申明一个 copy constructor,就会隐含的声明或隐含的定义一个.生成的 ...

  3. 深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作

    C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的 ...

  4. 构造函数语义学——Default Constructor篇

    构造函数语义学--Default Constructor 篇 这一章原书主要分析了:编译器关于对象构造过程的干涉,即在对象构造这个过程中,编译器到底在背后做了什么 这一章的重点在于 default c ...

  5. C++对象模型——Default Constructor的建构操作(第二章)

    第2章    构造函数语意学 (The Semantics of Constructor) 关于C++,最常听到的一个抱怨就是,编译器背着程序猿做了太多事情.Conversion运算符就是最常被引用的 ...

  6. C++对象模型(一):The Semantics of Constructors The Default Constructor (默认构造函数什么时候会被创建出来)

    本文是 Inside The C++ Object Model, Chapter 2的部分读书笔记. C++ Annotated Reference Manual中明确告诉我们: default co ...

  7. 构造函数语义学——Copy Constructor 篇

    构造函数语义学--Copy Constructor 篇 本文主要介绍<深度探索 C++对象模型>之<构造函数语义学>中的 Copy Constructor 构造函数的调用时机 ...

  8. The Semantics of Constructors: The Default Constructor (默认构造函数什么时候会被创建出来)

    本文是 Inside The C++ Object Model, Chapter 2的部分读书笔记. C++ Annotated Reference Manual中明确告诉我们: default co ...

  9. Default Constructor的构造操作

    Default Constructor的构造操作 C++ Annotated Reference Manual书中的Section 12.1说过:default constructor 只有在编译器需 ...

随机推荐

  1. java.sql.SQLException: Invalid parameter object type. Expected 'java.util.Map' but found 'java.lang.String 转载

    java.sql.SQLException: Invalid parameter object type. Expected 'java.util.Map' but found 'java.lang. ...

  2. .Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法

    前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...

  3. Bash远程文件传输命令scp

    备份远程文件(远程——>本地) scp -r 远程用户名@ip:文件绝对路径 本地绝对路径 还原远程文件(本地——>远程) scp -r 本地路径 远程用户名@ip:远程绝对路径 如果SS ...

  4. Android开发 --微信支付开发(转载!)(开发工具:Eclipse)

    Android_APP 微信支付接口开发 日期:2015-10-06 12:47:33 作者: 来源: 人气:3549 1.首先说一下我们在开发微信支付接口的时候遇到最多和最疑惑的问题,那就是明明 a ...

  5. SQL中使用的一些函数问题

    abs()取绝对值ceil()上取整floor()下取整initcap()使串中的所有单词的首字母变为大写substr()取子串 这些函数都是oracle的sql内置函数.

  6. Objective-C总Runtime的那点事儿(一)消息机制【转】

    RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何 ...

  7. error C2220: warning treated as error - no 'object' file generated解决方法

    error C2220: warning treated as error - no 'object' file generated 警讯视为错误 - 生成的对象文件 / WX告诉编译器将所有警告视为 ...

  8. SGU 150.Mr. Beetle II

    非常烦人的题,思路比较简单,十分容易出错,细节非常重要. 从四个不同的行走方向讨论经过的每一个格子. code: #include <iostream> #include <util ...

  9. SGU 190.Dominoes(二分图匹配)

    时间限制:0.25s 空间限制:4M 题意: 给定一个N*N的棋盘,一些格子被移除,在棋盘上放置一些1*2的骨牌,判定能否放满,并且输出任意方案. Solution: 首先考虑对棋盘的一个格子黑白染色 ...

  10. arm Linux 系统调用过程

    系统调用是操作系统提供给用户(应用程序)的一组接口,每个系统调用都有一个对应的系统调用函数来完成相应的工作.用户通过这个接口向操作系统申请服务,如访问硬件,管理进程等等.但是因为用户程序运行在用户空间 ...