默认构造函数,如果程序员没有为类定义构造函数,那么编译器会在【需要的时候】为类合成一个构造函数,而【需要的时候】分为程序员需要的时候和编译器需要的时候,程序员需要的时候应该由程序员来做工作,编译器需要的时候则由编译器来做工作。

C++中,全局变量 / 对象的内存会被清零(如果类对象没有程序员定义的构造函数的时候), 而堆heap 或 栈stack上的变量或对象则不会被清零,其内存只取决于上一次这段内存的值。

而编译器什么情况下会为类合成默认构造函数呢?
会在以下四种情况合成默认的构造函数:

1、类中有一个或多个类对成员,而类对象成员又有一个默认的构造函数(不管这个默认构造函数是显式声明的还是由编译器合成的)

2、当类继承子一个基类,而这个基类有一个默认构造函数(不管这个默认构造函数是显式声明的还是由编译器合成的)

3、当类声明了一个或多个虚函数时

4、当类派生自一个继承链,其中有一个或多个虚基类时

先来讨论第一种情况:类中有一个或多个类对成员,而类对象成员又有一个默认的构造函数

如果类中这种情况,则编译器会为类合成一个默认的构造函数,其构造函数内部做到工作只是调用该对象成员的默认构造函数,这个时候就是编译器【需要的时候】,当有多个对象成员时,编译器调用他们构造函数的顺序是按照他们在类中声明的顺序。

对于该类的其他简单成员,编译器不会对其进行初始化,这部分工作则需要又程序员来完成。

 二、当类继承子一个基类,而这个基类有一个默认构造函数

如果程序员没有为该类声明构造函数(而非默认构造函数),那么编译器会为该类合成一个默认构造函数。

特别的,当该了声明了若干个构造函数,而没有默认构造函数时,编译器则不会为该了合成默认构造函数,此时,编译器会去扩展现有的构造函数,在内部先去调用父类的默认构造函数,如果同时有类对象成员,那么去调用该类对象的默认构造函数,最后调用程序员的手动初始化代码。

三、当类声明了一个或多个虚函数时

四、当类派生自一个继承链,其中有一个或多个虚基类时

这两种情况都涉及到虚函数表指针vtpr的问题,所以都需要生成默认的构造函数来设置vtpr的合法值。

扩张行为:一个虚函数表(存放虚函数的地址), 一个虚函数表指针(指向虚函数表)

PS:两个误解:1任何类如果没有定义默认构造函数则编译器会合成一个出来   2编译器合成出来的默认构造函数会显式设定类中每个数据成员的默认值。

这两个都是错误的!

【C++对象模型】构造函数语意学之一 默认构造函数的更多相关文章

  1. 《深度探索C++对象模型》第二章 | 构造函数语意学

    默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一 ...

  2. C++ 合成默认构造函数的真相

    对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数. 合成默认构造函数会初始化类中所有的数据成员. 第一个误解来自于我学习 ...

  3. java中创建对象中使用默认构造函数的注意点

    public class Test3 {   private int n;   Test3() {      System.out.println("调用默认构造器");   }  ...

  4. C++的默认构造函数

    待看文章:C++ 合成默认构造函数的真相 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! 类的默认构造函数可以使得在实例化该类的对象时不用提供参数,但是类也可以不含默认构造函数,这样在实 ...

  5. C++ 构造函数与默认构造函数

    构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void)). 默认构造函数:未提供显式初始值时,用来穿件对象的构造函数. 以上是二者的定义,但是单 ...

  6. 【C++对象模型】构造函数语意学之二 拷贝构造函数

    关于默认拷贝构造函数,有一点和默认构造函数类似,就是编译器只有在[需要的时候]才去合成默认的拷贝构造函数. 在什么时候才是[需要的时候]呢? 也就是类不展现[bitwise copy semantic ...

  7. C++对象模型的那些事儿之三:默认构造函数

    前言 继前两篇总结了C++对象模型及其内存布局后,我们继续来探索一下C++对象的默认构造函数.对于C++的初学者来说,有如下两个误解: 任何class如果没有定义default constructor ...

  8. C++对象模型——默认构造函数的合成

    最近在学习C++对象模型,看的书是侯捷老师的<深度探索C++对象模型>,发现自己以前对构造函数存在很多误解,作此笔记记录. 默认构造函数的误解 1.当程序猿定义了默认构造函数,编译器就会直 ...

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

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

随机推荐

  1. A. Sorting Railway Cars

    A. Sorting Railway Cars time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  2. QT里使用sqlite的问题,好多坑

    1. 我使用sqlite,开发机上好好的,测试机上却不行.后来发现是缺少驱动(Driver not loaded Driver not loaded),代码检查了又检查,发现应该是缺少dll文件(系统 ...

  3. php动态滚动加载实例

    内容涉及:php.分页.jquery.div+css 实例下载:http://download.csdn.net/detail/roro5119/7373905 index.php <? //数 ...

  4. ASP.NET MVC 4 (一)路径映射

    原文:ASP.NET MVC 4 (一)路径映射 正如ASP.NET MVC名字所揭示的一样,是以模型-视图-控制设计模式构建在ASP.NET基础之上的WEB应用程序,我们需要创建相应的程序类来协调处 ...

  5. JavaMail如何保证邮件发送成功

    使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?一般的开放的api给我们调用都会有个返回值或者状态码,来告诉我们执行成功与否.但是Java ...

  6. Java API —— File类

    1.File类的概述         文件和目录路径名的抽象表示形式,创建File对象后,仅仅是一个路径的表示,不代码具体的事物一定是存在的. 2.构造方法         · public File ...

  7. 一些CSS技巧

    1.网页LOGO背景居中 html {   background: #f5f7f9 url(img/logo.png) no-repeat center center fixed;   backgro ...

  8. Hibernate开发之二 映射主键-

    <class name="cn.itcast.e_hbm_id.User" table="user">            <!-- 映射主 ...

  9. 关于PHP 7你必须知道的五件事

    1.今年的计划表已出.PHP 7时间表RFC投票一直通过, PHP 7将在2015年10月发布.尽管有些延迟,但我们还是很高兴它在今年内发布.PHP 7详细时间表由此查看. 2.PHP 要上太空飞船了 ...

  10. Android UI开发第三十篇——使用Fragment构建灵活的桌面

    http://www.lupaworld.com/article-222973-1.html 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android ...