隐藏在default construct后面的是什么
C++新手很容易陷入两个认识上的误区:
1.任何类如果不显示的定义一个构造函数那么编译器就会构造出一个默认构造函数。
2.默认构造函数负责类的所有数据成员的初始化,显然不是这样的。
为什么不是这样的,下面来进行详细的说明和解答,下面会说明在什么情况下一种有用的构造函数会被编译器构造出来。
类的默认构造函数:default construct,一个c++类什么时候需要构造出一个默认的构造函数,答案是在编译器需要的时候,这里指的是编译器需要的时候,举个例子。
Class Foo
{
Public :
Foo * pNext;
char * str;
}
在这个例子里面对象成员的初始化不应该交给编译器来做,因为对于类的对象的初始化是程序需要考虑的事情,当然也需要交由Foo类的构造者来完成。比如
Foo :: Foo()
{
Str = 0;
pNext =NULL;
}
- 默认构造函数由编译器声明分为多种的情形,其中情形一位:当一个类之中含有了一个已经存在默认构造函数其他类的对象时,那么这个类就需要声明出默认的构造函数来完成类的成员对象的初始化。
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后面的是什么的更多相关文章
- Spring Boot使用RestTemplate消费REST服务的几个问题记录
我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调用内外部REST接口完成业务逻辑. 在Spring Boot中,调用REST Ap ...
- 【图片识别】java 图片文字识别 ocr (转)
http://www.cnblogs.com/inkflower/p/6642264.html 最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为 ...
- java 图片文字识别 ocr
最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为java使用的demo 在此之前,使用这个工具需要在本地安装OCR工具: 下面一个是一定要安装的 ...
- RestTemplate 使用中的几个问题
Spring Boot使用RestTemplate消费REST服务的几个问题记录 我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调 ...
- Jackson学习笔记
老版本的Jackson使用的包名为org.codehaus.jackson,而新版本使用的是com.fasterxml.jackson. Jackson主要包含了3个模块: jackson-core ...
- ASP.NET空网页生成默认代码注释
当在Visual Studio下生成ASP.NET空网页时,默认生成代码: <%@ Page Language="C#" AutoEventWireup="true ...
- bootstrap加深
1.安装: bootstrap中文网:http://www.bootcss.com/ bootstrap.css样式:http://v3.bootcss.com/css/#tables class=' ...
- lua 中的面向对象
lua 是一种脚步语言,语言本身并不具备面向对象的特性. 但是我们依然可以利用语言的特性,模拟出面向对象的特性. 面向对象的特性通常会具备:封装,继承,多态的特性,如何在lua中实现这些特性,最主要的 ...
- Linux操作系统奥秘02-系统引导(GRUB)
GRUB的加载流程 GRUB是GNU的一款多重引导软件.GRUB包含了3个重要的文件:stage1 ,e2fsstage1_5,stage2.这三个文件分别代表了GRUB运行的3个阶段. 1.stag ...
随机推荐
- 一段四表联查外加字符拼接的sql,留存备查
select DISTINCT [P_ID],[P_CODE],[P_CODE_OLD],[P_NAME],[NATIVE_PLACE],[GENDER],[EDUCATION],[EMPLOY_DA ...
- GOF23设计模式之命令模式(command)
一.命令模式概述 将一个请求封装到一个对象,从而使得可用不同的请求对客户进行参数化. 二.命令模式结构 (1)Command 抽象命令类 (2)ConcreteCommand 具体命令类 (3)Inv ...
- 怎样用java生成GUID与UUID
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随机数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
- java后台获取URL带参demo
URL:http://aos.wall.youmi.net/v2/check_fb_sig?order=YM130402cygr_UTb42&app=30996ced018a2a5e& ...
- JS中的面向对象
创建对象的几种常用方式: 1,使用Object或对象字面量创建对象. 2,工厂模式创建对象. 3,构造函数模式创建对象. 4,原型模式创建对象. 使用Object或对象字面量创建对象: var stu ...
- chaep
Talk is cheap,show me the code! { job;/sbin/halt -p; } 关于shell脚本中提醒用法及参数输入 if [[ $# -ne 1 ]] then ec ...
- ansible初识三
一.setup模块 ansible的 setup模块主要用来收集信息, 查看参数: [root@localhost ~]# ansible-doc -s setup # 查看参数,部分参数如下: fi ...
- ubuntu下安装stm32开发环境
在windowns下开发stm32刚开始学最烦的就是创建工程模板,都不知道为什么要那样设置,而且步骤繁多.现在我告诉大家一个好消息,在linux下配置stm32开发环境包括创建工程,使用JLink仿真 ...
- 【Oracle】Oracle改变日志归档模式
一.确认工作模式: 1.查询V$DATABASE SQL>select log_mode from v$database; 归档日志:ARCHIVELOG 2.执 ...
- SpringBoot核心
1.基本配置 1.1入口类和@SrpingBootApplication SpringBoot通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法就是一个标准的 ...