类通过一个特殊的构造函数来控制默认初始化过程。这个函数就是默认构造函数。默认构造函数无需不论什么实參。

我们能够显示的定义默认构造函数也能够让编译器为我们生成默认构造函数。

默认构造函数以例如以下规则初始化累的数据成员:

  • 假设存在类内初始值,用它来初始化成员。
  • 否则。默认初始化该成员。

class Sales_data {
public:
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};

如上所看到的。由于Sales_data为units_sold和revenue提供了初始值,所以合成默认构造函数将使用这些值来初始化相应的成员,而bookNo被默认初始化为一个空字符串。

合成默认构造函数仅仅适用于很easy的类,通常来说。我们须要为自己定义类提供默认构造函数,由于:

  • 编译器仅仅有在发现类不包括不论什么构造函数的情况下才会替我们生成默认构造函数。

    一旦我们定义了一些其他的构造函数,除非我们再定义一个默认构造函数。否则这个类将没有默认构造函数。

    由于一个类在某种情况下须要控制对象初始化,那么该类可能须要在全部情况下都控制初始化。

  • 合成的默认构造函数可能运行错误的操作,比方对复合类型(数组和指针),默认初始化的结果是没有定义的。
  • 有的编译器不能为某些类合成默认构造函数。比方类中包括一个其他类类型的成员,且这个成员的类型没有默认构造函数。

defaultkeyword:

class Sales_data {
public:
Sales_data() = default;
Sales_data(const std::string &s) bookNo(s) {}
Sales_data(const std::string &s, unsigned n, double p) :
bookNo(s), units_sold(n), revenu(p*n) {}
Sales_data(std::istream &); std::string isbn() const { return bookNo; }
Sales_data& combine(const Sales_data&);
double avg_price() const;
private:
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};

在C++11标准中,假设我们须要默认的行为,能够通过在參数列表后来要求编译器生成默认构造函数。

default既能够和声明一起出如今类的内部,也能够作为定义出如今类的外部。假设=default在类的内部,则默认构造函数是内联的,假设它在类的外部,则该成员函数默认情况下不是内联的。

[C++11] 默认构造函数的更多相关文章

  1. 合成的默认构造函数定义为delete的一种情况(针对C++11标准)

    1. 默认初始化 如果定义变量时没有指定初值,则变量会被默认初始化,此时变量被赋予了"默认值". 对于类类型的变量来说,初始化都是依靠构造函数来完成的.因此,即使定义某个类的变量( ...

  2. C++学习笔记16,C++11中的显式的默认构造函数以及显示删除默认构造函数

    在早期的C++中.假设须要一些接受一些參数的构造函数,同一时候须要一个不接收不论什么參数的默认构造函数.就必须显示地编写空的默认构造函数.比如: //tc.h class A{ private: in ...

  3. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  4. c++11 move构造函数和move operator 函数 学习

    先看个代码吧!!!!!!!!!! #include <iostream> using namespace std; class A { public: A(){cout<<&q ...

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

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

  6. C++中若类中没有默认构造函数,如何使用对象数组

    前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: #include <memory> #include <iostream> ...

  7. c++11的构造函数继承

    https://en.cppreference.com/w/cpp/language/using_declaration 在[Inheriting constructors]这一节. 其实叫做"基类的 ...

  8. c++11 继承构造函数

    若基类拥有数量众多的不同版本的构造函数,而派生类中只有一些成员函数,则对于派生类而言,其构造函数就等同于构造基类. struct A { A(int i) {} A(double d, int i) ...

  9. C/C++ 关于默认构造函数

    前言: 在C++中,对于一个类,C++的编译器都会为这个类提供四个默认函数,分别是: A() //默认构造函数 ~A() //默认析构函数 A(const A&) //默认拷贝构造函数 A&a ...

随机推荐

  1. Perl模块利用CPAN在线安装自动化

    需要解决2个问题: 1.  如何与CPAN交互:利用perl –MCPAN –e ‘install 模块’ 2.  如何安装指定的版本:作者/模块-版本.tar.gz How to install a ...

  2. Python安装(一)

    Python的安装 打开python的官网 进入下载界面 选择下载 安装步骤如下所示: 安装完成进入到dos界面,输入python -V,如下图展示及成功 打开Python工具 1:: print() ...

  3. 解读I/O多路复用技术

    前言 当我们要编写一个echo服务器程序的时候,需要对用户从标准输入键入的交互命令做出响应.在这种情况下,服务器必须响应两个相互独立的I/O事件:1)网络客户端发起网络连接请求,2)用户在键盘上键入命 ...

  4. HN0I2000最优乘车 (最短路变形)

    HN0I2000最优乘车 (最短路变形) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! [试题]为了简化城市公共汽车收费系 ...

  5. dynamic_cast与能力查询

    在C++里面,dynamic_cast 通常用于横向转换,而不是向上或者向下的转换. 这个常常用于检查某个实例,是否实现了某个接口类,那么就把这个实例,用dynamic_cast来转换成这个接口类的实 ...

  6. UML之序列图

    一 序列图概述: 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸. 横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存 ...

  7. Id选择器和Class选择器

    http://www.runoob.com/css/css-id-class.html http://www.w3school.com.cn/css/css_syntax_id_selector.as ...

  8. Python(十一) 原生爬虫

    一.分析抓取目的确定抓取页面   #爬取主播人气排行 二.整理爬虫常规思路   爬虫前奏 明确目的 找到数据对应的网页 分析网页的结构找到数据所在的标签位置 模拟 HTTP 请求, 向服务器发送这个请 ...

  9. Firefox 浏览器添加Linux jre插件

    在安装 Java 平台时,Java 插件文件将作为该安装的一部分包含在内.要在 Firefox 中使用 Java,您需要从该发行版中的插件文件手动创建符号链接指向 Firefox 预期的其中一个位置. ...

  10. 在Navicat中如何新建数据库和表并做查询

    上一篇文章,小编给大家分享了在Navicat中如何远程连接数据库,没有来得及上车的小伙伴可以戳这篇文章:在Ubuntu14.04中配置mysql远程连接教程.今天小编给大家分享一下如何在Navicat ...