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. MySQL学习笔记-MySQL数据库优化实践[转]

    最近一段时间,我们整理了一些关于Percona,Linux,Flashcache,硬件设备的优化经验,分享给大家: 硬件 1.开启BBWC RAID卡都有写cache(Battery Backed W ...

  2. 设计模式之生成者模式java源代码

    假设要组装一辆自行车,并且自行车就是车轮和车架组成. Builder对应于组装自行车所使用的车轮和车架 ConcreteBuiler对应于自行车的车轮和车架,同时可以返回一辆自行车. Product对 ...

  3. CentOS7安装ms8可能出现的错误

    参照<在Centos上安装MS8.0的详细过程>:http://muchong.com/html/201507/9145663.html 安装过程中如果库文件不全,会异常终止.报错情况如下 ...

  4. 各种 on事件触发js代码

    [转]各种 on事件触发js代码 1.onmouseenter:当鼠标进入选区执行代码 <div style="background-color:red" onmouseen ...

  5. 强连通缩点— HDU1827

    强连通缩点以后最终形成的是一棵树 我们可以根据树的性质来看缩点以后的强连通分量图,就很好理解了 /* gyt Live up to every day */ #include<cstdio> ...

  6. 团队-Python 爬取豆瓣电影top250-成员简介及分工

    姓名:周鑫 班级:软件6班 团队名称:咣咣踹电脑 擅长:Python,java 分工:编写数据库

  7. word中括号中公式对齐

    在写论文中使用到括号,但没有对齐,如: 但是我需要对齐,如: 此时只需要在每行需要对齐的地方输入‘&’即可(此符号在专业型括号是不可见的,在线性中可见,上图为专业型),同样也可以有多个对齐点, ...

  8. 链栈的基本操作(C语言)

    栈的链式储存结构称为链栈.链栈的节点类型与链式线性表的节点类型 定义相同,不同的是它是仅在表头进行操作的单链表.链栈通常用不带头节 点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示: 代码如下: ...

  9. jquery 特效

    http://demo.howtoexe.com/instagram-gravity-gallery/index.html

  10. js中定时器相关

    每三秒(3000 毫秒)弹出 "Hello" : setInterval(function(){ alert("Hello"); }, 3000); setIn ...