1. 默认初始化

如果定义变量时没有指定初值,则变量会被默认初始化,此时变量被赋予了“默认值”。

对于类类型的变量来说,初始化都是依靠构造函数来完成的。因此,即使定义某个类的变量(对象)时没有提供初始化式,我们也能通过类的默认构造函数来完成初始化。即,“默认值”由默认构造函数来决定(前提是该类有默认构造函数)。

对于内置类型的变量来说,当定义没有初始化式的变量时,系统有时会帮我们初始化变量。“默认值”由定义的位置决定:定义于任何函数体之外的变量被初始化为0;定义在函数体内部的变量默认值是未定义的,不会由系统自动初始化,虽然值是未定义的,但是仍然是有一个默认值的。即,“默认值”由定义的位置决定。

2. 针对const类型的默认值

const对象一旦创建后,其值就不能再改变,所以const对象必初始化(注意,必须由用户来决定怎么初始化从而给定默认值,而不是依靠系统)。

对于内置类型变量来说,我们自己初始化时,只有一种办法,就是提供值。即const内置类型变量无法默认初始化,系统也不会提供默认值。因此类似以下的代码语法上就是错的:

const int ival;   // 错误,ival没有初始化

对于类类型变量来说,我们通过构造函数来完成变量的初始化,这当然也包括了默认构造函数(必须是用户自定义的默认构造函数,而非系统合成的默认构造函数),因此可以在定义对象时,不提供初始化式:

const A object;   // 正确,通过默认构造函数来初始化

3. 合成的默认构造函数定义为delete的一种情况

1. 编译器创建的合成的默认构造函数按以下规则初始化类的数据成员:

-> 如果该数据成员有类内初始值,则在默认构函数中用类内初始值来初始化成员。

-> 如果该数据成员没有类内初始值,则在默认构造函数中该成员采取默认初始化。(更确切的说,是使用该成员的默认值)

2. 联系《primer 5th》page450-451

-> 如果在类中,有一个没有类内初始化器的const内置类型成员,则该成员没有办法初始化(因为const内置类型变量必须由用户自己来初始化,注意:const的内置类型变量是无法默认初始化的)。因为该成员没有办法自己初始化(通过以上1的两种方式初始化),因此该类的默认构造函数定义为删除(delete)。

-> 如果在类中,有一个没有类内初始化器的const类类型成员,且其类型没有显示定义默认构造函数(导致该const类类型成员也没有办法默认初始化),因此该类的默认构造函数定义为删除(delete)。

-> 如果在类中,有一个没有类内初始化器的类类型成员,且其类型没有定义默认构造函数(导致类类型成员也没有办法默认初始化),因此该类的默认构造函数被定义为删除(delete)。

有关此处的delete情况小结:

1. 首先需要明确内置类型变量是否可以默认初始化取决于变量位置,但无论如何,对于非const内置类型变量而言,一定会有一个默认值,即便其也许是未定义的;而对于类类型变量,如果要有默认值,必须要有默认构造函数,如果没有默认构造函数,其无法进行默认初始化。

2. 对于没有类内初始化器的内置类型成员来说,const使成员失去了拥有默认值的能力。

3. 对于没有类内初始化器的类类型成员来说,加const,必须有用户自定义的默认构造函数,才可以默认初始化,从而拥有默认值。不加const,那么只要有默认构造函数(隐式、显示均可)即可默认初始化,从而拥有默认值。

4. 本质含义

如果一个类有数据成员不能默认构造(更确切的说是无法拥有默认值)、拷贝、复制或销毁,则对应的成员函数将被定义为delete。

5. 与c++03标准区别

系统合成的构造函数定义为delete是c++11标准中提出的概念。

对于c++03标准而言,在有默认构造函数,且不是用户自定义的默认构造函数的情况下,那么我们默认隐式的默认构造函数一定是存在的。

合成的默认构造函数定义为delete的一种情况(针对C++11标准)的更多相关文章

  1. C++关于编译器合成的默认构造函数

    有两个常见的误解: 1.任何类如果没有定义默认构造函数,就会被合成出一个来. 2.编译器合成的默认构造函数会显式地设定类内每一个数据成员的默认值. 对于第一个误解,并不是任何类在没有显式定义默认构造函 ...

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

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

  3. C++中默认构造函数中数据成员的初始化

    构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据 ...

  4. 【C++对象模型】构造函数语意学之一 默认构造函数

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

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

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

  6. [C++11] 默认构造函数

    类通过一个特殊的构造函数来控制默认初始化过程.这个函数就是默认构造函数.默认构造函数无需不论什么实參. 我们能够显示的定义默认构造函数也能够让编译器为我们生成默认构造函数. 默认构造函数以例如以下规则 ...

  7. C++编译器会对没有构造函数的类生成默认构造函数吗?(有必要的时候才生成,要看情况。有反汇编验证)

    之前在上C++的课的时候,印象中有那么一句话:如果一个类没有任何构造函数,那么编译器会生成一个默认的构造函数 今天在看<深度探索C++对象模型>的第二章:“构造函数语意学”的时候发现之前听 ...

  8. C++编译器合成Default Constructor的4种情况

    笔记C++编译器为编译器需要合成Default Constructor的4种情况. 1,Class A内含Class B对象,Class A没有Default Constructor时会在编译时合成D ...

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

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

随机推荐

  1. 数据结构:链表 >> 链表按结点中第j个数据属性排序(冒泡排序法)

    创建结点类,链表类,测试类 import java.lang.Object; //结点node=数据date+指针pointer public class Node { Object iprop; p ...

  2. 服装类Web原型制作分享——Rodd & Gunn

    Rodd & Gunn是国外知名的服装类品牌,服装种类繁多,有衣服.帽子.穿戴饰品等. 本原型由国产Mockplus(原型工具)和iDoc(智能标注,一键切图工具)提供. 网站原型以图文排版为 ...

  3. samtools flagstat

    samtools flagstat命令简介: 统计输入文件的相关数据并将这些数据输出至屏幕显示.每一项统计数据都由两部分组成,分别是QC pass和QC failed,表示通过QC的reads数据量和 ...

  4. JWT-Token登陆校验

    JWT:就是靠给客户端(浏览器)一个规范凭证(签名),然后服务器解析签名,代替原有的session存值. 不带refreshToken的JWT例子:https://blog.csdn.net/u011 ...

  5. spring学习 十八 spring的声明事物

    1.编程式事务: 1.1 由程序员编程事务控制代码.commit与rollback都需要程序员决定在哪里调用,例如jdbc中conn.setAutoCimmit(false),conn.commit( ...

  6. Java ClassLoad详解

    Java ClassLoad详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1. ...

  7. kbmmw 5.01 发布

    Important notes (changes that may break existing code) ============================================= ...

  8. 消除flex-wrap之后每个item上下的距离

    设置flex-wrap后,每个item上下都会有距离.更改父元素的高度,就可以删除这些距离. 更改后:

  9. ant Design和ant Design mobile的使用,并实现按需加载

    1.全局安装yarn npm install -g create-react-app yarn 2.创建react项目,并用yarn start 运行 3.引入antd/引入antd-mobile y ...

  10. c#用EPPLUS操作excel

    参考: http://www.cnblogs.com/rumeng/p/3785748.html http://www.cnblogs.com/libla/p/5824296.html#3818995 ...