C++新手很容易陷入两个认识上的误区:

1.任何类如果不显示的定义一个构造函数那么编译器就会构造出一个默认构造函数。

2.默认构造函数负责类的所有数据成员的初始化,显然不是这样的。

为什么不是这样的,下面来进行详细的说明和解答,下面会说明在什么情况下一种有用的构造函数会被编译器构造出来。

类的默认构造函数:default construct,一个c++类什么时候需要构造出一个默认的构造函数,答案是在编译器需要的时候,这里指的是编译器需要的时候,举个例子。

Class Foo

{

Public :

Foo * pNext;

char * str;

}

在这个例子里面对象成员的初始化不应该交给编译器来做,因为对于类的对象的初始化是程序需要考虑的事情,当然也需要交由Foo类的构造者来完成。比如

Foo :: Foo()

{

Str = 0;

pNext =NULL;

}

  1. 默认构造函数由编译器声明分为多种的情形,其中情形一位:当一个类之中含有了一个已经存在默认构造函数其他类的对象时,那么这个类就需要声明出默认的构造函数来完成类的成员对象的初始化。

Class Foo

{

Public :

Foo ();

Foo(int);

}

Class Bar

{

Public :

Foo foo;

Char * str;

}

此时就需要类的构造函数来进行Foo类对象的初始化,这里再次分为两种情况,第一种就是Bar类的构造着不进行显示的构造函数编写,那么就会由编译器来进行默认构造函数的构建就像下面这样,编译器默认的构造函数只负责foo对象的初始胡他并不会负责str的初始化。

Bar::bar()

{

Foo.Foo::Foo();

}

当Bar类的构造着显示的声明了一个构造函数的时候编译器在用户代码之前也会负责进行Foo对象的初始化就像下面一样。

用户代码:Bar::bar()

{

Str = 0;

}

编译器添加了初始化代码之后的结构:

Bar::bar()

{

//在用户代码之前编译器必须负责构造foo对象

// Foo.Foo::Foo();

Str = 0;

}

需要注意的是当一个类包含了多个其他类的成员对象的时候需要按照顺序进行类的对象初始化向下面的例子。

Class point {public : point()}

Class line  {public: line(); line(int)}

Class shape {public: shape()……}

Class test

{

Public :

Point m_point;

Line m_line;

Shape m_shape;

Private :

Int m_ival;

}

显示的构造函数,用户代码:test::test():line(1024)

{

M_ival = 0;

}

编译器代码:

Test:test():line(1024)

{

//首先需要对对象point和shape进行初始化,这些操作都将由编译器完成

//Point:point::point();

Line:line::line(1024);

//Shape.shape::shape();

M_ival = 0;

}

2.带有默认构造函数的基类

带有默认构造函数的基类,对于这种类型的构造函数和之前提到过的相似,因为派生类对象在构造之前必须要先构造出基类的构造函数,所以编译器在编译阶段会进行代码扩展,将基类的默认构造函数添加到派生类的构造函数代码中。

3.基类含有vritual function 的派生类对象

因为这种类型的类编译器在编译阶段需要产生一个虚表vtab和一个指向vtab的虚表指针vptr,vptr内含虚表的地址值。出于这种考虑如果用户不声明一个构造函数,那么编译器必须合成出一个默认的构造函数来进行每一个对象的虚表指针vptr的初始化。

4.含有virtual class 的派生类

和上面的道理一样,编译器也必须产生出一个指向虚基类的指针进行虚基类成员的操作,这个阶段就发生在默认构造函数中。

隐藏在default construct后面的是什么的更多相关文章

  1. Spring Boot使用RestTemplate消费REST服务的几个问题记录

    我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调用内外部REST接口完成业务逻辑. 在Spring Boot中,调用REST Ap ...

  2. 【图片识别】java 图片文字识别 ocr (转)

    http://www.cnblogs.com/inkflower/p/6642264.html 最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为 ...

  3. java 图片文字识别 ocr

    最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为java使用的demo 在此之前,使用这个工具需要在本地安装OCR工具: 下面一个是一定要安装的 ...

  4. RestTemplate 使用中的几个问题

    Spring Boot使用RestTemplate消费REST服务的几个问题记录 我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调 ...

  5. Jackson学习笔记

    老版本的Jackson使用的包名为org.codehaus.jackson,而新版本使用的是com.fasterxml.jackson. Jackson主要包含了3个模块: jackson-core ...

  6. ASP.NET空网页生成默认代码注释

    当在Visual Studio下生成ASP.NET空网页时,默认生成代码: <%@ Page Language="C#" AutoEventWireup="true ...

  7. bootstrap加深

    1.安装: bootstrap中文网:http://www.bootcss.com/ bootstrap.css样式:http://v3.bootcss.com/css/#tables class=' ...

  8. lua 中的面向对象

    lua 是一种脚步语言,语言本身并不具备面向对象的特性. 但是我们依然可以利用语言的特性,模拟出面向对象的特性. 面向对象的特性通常会具备:封装,继承,多态的特性,如何在lua中实现这些特性,最主要的 ...

  9. Linux操作系统奥秘02-系统引导(GRUB)

    GRUB的加载流程 GRUB是GNU的一款多重引导软件.GRUB包含了3个重要的文件:stage1 ,e2fsstage1_5,stage2.这三个文件分别代表了GRUB运行的3个阶段. 1.stag ...

随机推荐

  1. 【转】redis GEO地理位置

    redis目前已经到了3.2版本,3.2版本里面新增的一个功能就是对GEO(地理位置)的支持. 地理位置大概提供了6个命令,分别为: GEOADD GEODIST GEOHASH GEOPOS GEO ...

  2. VS2017更新后无法使用stdlib.h

    这几天用VS写代码,每次打开工程就卡死,在网上找不到解决方法,于是想更新下vs碰碰运气. 更新后,打开速度恢复往日那般,但是代码中,提示我找不到 stdlib.h. 于是在电脑中,搜寻stdlib.h ...

  3. ZOJ 3593 One Person Game(拓展欧几里得求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  4. kubernetes 核心原理

    3.1 K8s API Server 原理分析 K8s API server核心提供对各种资源对象的增.删.改.查以及Watch等HTTPRest接口,是集群内各个模块之间数据交互和通信的中心枢纽,是 ...

  5. http 和 https 区别?

    1. HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头2. HTTP 是不安全的,而 HTTPS 是安全的3. HTTP 标准端口是80 ,而 HTTPS ...

  6. DynamicConverter

    folly/DynamicConverter.h When dynamic objects contain data of a known type, it is sometimes useful t ...

  7. Oracle 热备份

    Oracle 热备份是指数据库处于open状态下,对数据库的数据文件.控制文件.参数文件.密码文件等进行一系列备份操作. 热备是基于用户管理备份恢复的一种方式,也是除了RMAN备份之外较为常用的一种备 ...

  8. Django 模型层(2)

    多表操作: 创建模型: 作者模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及em ...

  9. 移动终端App测试点归纳

    以下所有测试最后必须在真机上完整的执行. 1 安装.卸载测试 1.1 在真机上.第三方软件(xy苹果助手.91.安卓助手)的安装与卸载 1.2 安装在手机卡上 或 SD卡上 (不同的IOS和安卓版本) ...

  10. 关于OpenGL Framebuffer Object、glReadPixels与离屏渲染

    最近写论文需要用到离屏渲染(主要是因为模型太大普通窗口绘制根本做不了),于是翻阅了红宝书查了下相关api和用法.中文版的红宝书可读性有点差,很多地方翻译地晦涩,但好歹读起来比较快,主要相关章节为第8章 ...