在C++中,如果没有在构造函数初始值列表中显示地初始化成员,则该成员将在构造函数体之前执行默认初始化。之后,再进入构造函数体{}中,随着构造函数体一开始执行,初始化地工作实际上就完成了。

下面两个构造函数,虽然执行后,成员变量的值都一致,但过程和效率却不一样。第一个构造函数,使用构造函数初始化列表,效率更高;而第二个构造函数,没有在初始值列表中显示地初始化,所以实际是先进行了默认初始化,然后再进入构造函数体{}中执行赋值操作。

Sales_data::Sales_data(const string &s, unsigned cnt, double price) : bookNo(s), units_sold(cnt), revenue(cnt*price)
{
}
Sales_data::Sales_data(const string &s, unsigned cnt, double price)
{bookNo     = s;units_sold = cnt;revenue    = cnt * price;
}

如果成员是const或者引用的话,必须将其初始化。类似的,当成员属于某种类类型而且该类没有定义默认构造函数时,必须将这个成员初始化。我们初始化const或者引用类型的数据成员的唯一机会就是通过构造函数初始值。

class ConstRef
{
public:ConstRef(int ii);
private:int       i;const int ci;int       &ri;
}
// 错误
ConstRef::ConstRef(int ii)
{i  = ii;     // 正确ci = i;      // 错误ri = i;      // 错误
}// 正确:显示地初始化const成员和引用
ConstRef::ConstRef(int ii): i(ii), ci(i), ri(i)
{
}

构造函数初始值中每个成员只能出现一次。构造函数初始值列表只说明用于初始化成员的值,而不限定初始化的具体执行顺序。成员的初始化顺序与它们在类定义中的出现顺序一致。构造函数初始值列表中初始值的前后位置关系不会影响实际的初始化顺序。

C++中如何初始化类中const或引用类型的数据成员?相关推荐

  1. python buildin 中的一些类中为什么方法的内容都是pass?

    python buildin 中的一些类中为什么方法的内容都是pass? 文章目录: 一.看到的一些方法的定义都是pass 二.如何查看Python的源代码 python 的源代码是用C语言写的 一. ...

  2. C++中两个类中互相包含对方对象的指针问题

    前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某一个类未定义...所以我就想啊想,这样也对,我的头文件都有#ifndef的,包含了一次就不能再包含了,以为就实现不了这样的功能,于是 ...

  3. springboot 项目中在普通类中调用dao层的mapper 出现空指针异常

    springboot 项目中在普通类中调用dao层的mapper 出现空指针异常 参考文章: (1)springboot 项目中在普通类中调用dao层的mapper 出现空指针异常 (2)https: ...

  4. JSP中调用java类中的方法

    JSP中调用java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:test 2.再在包中添加一个类:如 package test; public class conDatabase { ...

  5. java bufferedread_java中关于bufferedreader类中read方法

    java中关于bufferedreader类中read方法 关注:58  答案:2  mip版 解决时间 2021-01-14 05:40 提问者孤城古巷 2021-01-13 06:28 如下.此时 ...

  6. 类的静态成员函数和静态数据成员

    一.静态数据成员 1.定义: 静态数据成员就是给类的普通数据成员加上关键字static. 2.访问规则 静态数据成员也遵守public/protected/private访问规则 访问静态成员时,则可 ...

  7. C++【对象模型】 | 【05】类与类之间各种关系下对数据成员的存取、绑定、布局

    文章目录 索引 1.类继承造成的负担 2.data member 3.data member的绑定 4.data member的布局 5.data member的存取 静态数据成员 非静态数据成员 6 ...

  8. c++中可以对类中私有成员中的静态变量初始化吗?

    转载http://www.cnblogs.com/carbs/archive/2012/04/04/2431992.html 问题:我看的书上写的对私有部分的访问可以是公共部分的成员函数,也可以是友员 ...

  9. python类中的 init_Python类中__init__()的作用

    最开始学习python,认为定义类时__init__方法的作用等同于C中的构造函数,但是使用之后发现也有区别. # coding:utf-8 class a(): def __init__(self, ...

最新文章

  1. android 动态人脸识别码,android OpenCV研究之动态人脸识别
  2. go的异常处理,defer,panic,recover
  3. 监控利器之 Prometheus
  4. self studying room list available at campus
  5. 华为swot分析2020_2020华为音频产品汇总分析,完善产品质量,丰富产品线
  6. ROS与navigation教程——概述
  7. stl vector 函数_vector :: crbegin()函数,以及C ++ STL中的示例
  8. 面试官 | Java转List三种方式,你说说吧。我。。懵逼。啥时候有三种了
  9. OpenShift 4 - Fedora CoreOS (3) - 定制 CoreOS ISO
  10. vmWare中安装centos7
  11. macos 开发环境配置
  12. Linux服务器管理神器-IPython
  13. Android屏幕共享与直播-red5流媒体服务器搭建
  14. unbuntu20.04下载opencv4.5.2
  15. shell脚本之单引号,双引号,反引号
  16. 阅读《第31次中国互联网络发展状况统计报告》,对中国互联网发展趋势和特点的分析
  17. promise执行顺序总结
  18. PySpark——开启大数据分析师之路
  19. App架构师实践指南四之性能优化一
  20. Linux之ss命令

热门文章

  1. Linux系统管理技术手册——第6章 添加新用户
  2. Photoshop阴影与内阴影
  3. 64位虚拟机下asm()语法_一步步学写Windows下的Shellcode
  4. [Android] AlertDialog获取网上天气并显示各城市天气
  5. BASIC-12 十六进制转八进制
  6. AI Studio 学习 Go 豆瓣电影爬取
  7. Java初阶知识总结
  8. 【前端5】vue:实例,插值表达式,v-,组件
  9. 【Linux】一步一步学Linux——fgrep命令(了解)(51)
  10. 【Linux】Linux中正则表达式