1. 4种情况下编译器会构造出nontrivial(有用)的构造函数

    1. 带有default construction的member class object

      我们有两个class:

      class Foo { public: Foo(), Foo(int) … };

      class Bar { public: Foo foo; char *str;};

      1. 则编译器会在Bar中合成一个默认的构造函数(看起来像这样):

        Bar() { foo.Foo::Foo(); }
      2. 当我们自己定义了Bar一个或以上的构造函数时,编译器会为我们扩张

        每一个构造函数。比如我们自己定义:

        Bar() { str = 0;}

        则编译器就为我们扩张成:

        Bar() { foo.Foo::Foo(); str = 0; }
      3. 当有多个需要初始化的成员时,编译器会按照成员的声明次序来初始化成员
    2. 带有default construction的base class
    3. 声明或继承一个virtual function的class
      1. 一个virtual function table 会被编译器产生出来,内放class的virtual function 地址。
      2. 在每个class object中,一个额外的pointer member(vptr)会被编译器合成出来,内含

        相关的class vtbl的地址。
    4. 带有一个virtual base class的class

      对于virtual base class中的成员变量,derived class通过存放一个指针,指针中存放

      着对应的基类,用这样的方式来访问virtual base class中的成员变量。

      所以为了初始化这些指针,编译器会默认构造出或扩张nontrivial构造函数做这些初

      始化的工作。
  2. c++新手常见的两个误解
    1. 任何class如果没有定义default constructor,就会被合成出来。
    2. 编译器合成出来的default constructor会明确设定class内每个

      datamember的默认值。

      这两个没有一个是真的

default construction的更多相关文章

  1. Thinking in Java——笔记(18)

    I/O The original byte-oriented library was supplemented with char-oriented, Unicode-based I/O classe ...

  2. 【Spring源码解析】—— 依赖注入结合SpringMVC Demo-xml配置理解

    在IOC容器初始化的梳理之后,对依赖注入做一个总结,就是bean实例化的过程,bean的定义有两种方式,一种是xml文件配置,一种是注解,这里是对xml配置文件的依赖注入的介绍,后续对bean与该部分 ...

  3. pl-svo代码解读

    pl-svo是在svo的基础上结合点和线特征的半直接法视觉里程计 程序启动通过app文件夹下的run_pipeline.cpp主程序启动,其它的函数文件统一放在src文件夹下,我们先从run_pipe ...

  4. C++ Core Guidelines

    C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very ...

  5. C++ std::thread

    std::thread Defined in header class thread The class thread represents a single thread of execution. ...

  6. Java - this的使用方法

    this在内部获得当前对象的引用时调用: (1) return返回当前对象; (2) 构造器调用还有一个构造器, 带參数; (3) 參数的名称和数据成员的名称同样; 注意: this构造器在方法中仅仅 ...

  7. IoC 之加载 Bean:总结

    上文中我们将bean已经加载到了IOC容器中,接下来我们将把IOC加载Bean出来进行代码解析 备注:(有些解释是参考别个博客的相关解释 )一起探讨请加我QQ:1051980588 bean 的初始化 ...

  8. Havok Physics 2012(2)

    目录 Havok Physics 2012 Chapter 2. Creating a Simulation 创建一个模拟世界 1. Creating Physics 2012 Objects Hav ...

  9. C++11智能指针之std::unique_ptr

    C++11智能指针之std::unique_ptr   uniqut_ptr是一种对资源具有排他性拥有权的智能指针,即一个对象资源只能同时被一个unique_ptr指向. 一.初始化方式 通过new云 ...

随机推荐

  1. 理解ES6中的Promise

    一.Promise的作用 在ajax请求数据的过程中,我们可以异步拿到我们想要的数据,然后在回调中做相应的数据处理. 这样做看上去并没有什么麻烦,但是如果这个时候,我们还需要做另外一个ajax请求,这 ...

  2. system.transfer.list深度解析

    system.transfer.list  system.new.dat 很明显,通过名字我们就知道这两个文件的作用,system.new.dat为数据部分,system.transfer.list为 ...

  3. 用PRODUCT_COPY_FILES拷贝文件夹

    拷贝文件PRODUCT_COPY_FILES += device/qcom/msm8909/media/media_profiles_8909.xml:system/etc/media_profile ...

  4. webrtc学习: 部署stun和turn服务器

    webrtc的P2P穿透部分是由libjingle实现的. 步骤顺序大概是这样的: 1. 尝试直连. 2. 通过stun服务器进行穿透 3. 无法穿透则通过turn服务器中转. stun 服务器比较简 ...

  5. Python和Lua的默认作用域以及闭包

    默认作用域 前段时间学了下Lua,发现Lua的默认作用域和Python是相反的.Lua定义变量时默认变量的作用域是全局(global,这样说不是很准确,Lua在执行x = 1这样的语句时会从当前环境开 ...

  6. late_initcall和module_init的区别

    在init.h中有如下定义: 详情参照:linux 设备驱动加载的先后顺序 #define pure_initcall(fn) __define_initcall("0",fn,1 ...

  7. 第四章 Hyper-V 2012 R2 网络配置

      尼玛的我不高兴写了,所以下面的文档我直接把原来的pdf给转换出来,加了点自己的注解,我写的话会写自己觉得终于的章节. 在搭建虚拟化平台时,网络的虚拟化是一个非常重要的环节,如何保障网络的持续可用并 ...

  8. 【软件工程1916|W(福州大学)_助教博客】团队答辩助教问题记录

    周一进行了团队项目的课堂答辩,结合团队项目报告对团队项目提出了1-2个问题,将问题和团队回答巨鹿如下 那周余嘉熊掌将得队 如何用户保证隐私安全?答:后期考虑,团队中有一个专业是信息安全的,会针对这块提 ...

  9. 个人博客作业Week3(微软必应词典客户端的案例分析)

    软件缺陷常常又被叫做Bug,即为计算机软件或程序中存在的某种破坏正常运行能力的问题.错误,或者隐藏的功能缺陷.缺陷的存在会导致软件产品在某种程度上不能满足用户的需要.IEEE729-1983对缺陷有一 ...

  10. Java对XML文件解析方式之一_SAX

    SAX(org.xml.sax) Simple API for XML,以事件的形式通知程序,对Xml进行解析.   SAX技术的介绍:SAX是一种以事件驱动的XML api,由它定义的事件流可以指定 ...