构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:

[cpp] view plaincopy
  1. class CExample {
  2. public:
  3. int a;
  4. float b;
  5. //构造函数初始化列表
  6. CExample(): a(0),b(8.8)
  7. {}
  8. //构造函数内部赋值
  9. CExample()
  10. {
  11. a=0;
  12. b=8.8;
  13. }
  14. };

上面的例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;

而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。

初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。

但有的时候必须用带有初始化列表的构造函数:
1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

2.const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。 或者改为static。

【常量必须在构造函数的初始化列表里面初始化 或 设置成static】

例子:

class A
{const int size = 0;//错误
}class A
{A(){ const int size = 9; }
}或者
class A
{static const int size = 9;
}

初始化列表的成员初始化顺序:
C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。跟初始化列表的顺序无关
Example:

[cpp] view plaincopy
  1. class CMyClass
  2. {
  3. CMyClass(int x, int y);
  4. int m_x;
  5. int m_y;
  6. };
  7. CMyClass::CMyClass(int x, int y) : m_y(1), m_x(m_y)
  8. {
  9. }

你可能以为上面的代码将会首先做m_y=1,然后做m_x=m_y,最后它们有相同的值。

但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。

有两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。

C++类构造函数初始化列表及初始化成员变量的误区相关推荐

  1. 28.构造函数中,成员变量一定要通过初始化列表来初始化的?

    首先要明确:如果对象成员是const或者引用的话,必须将其初始化! 构造函数中,成员变量一定要通过初始化列表来初始化的的几种情况! 1)对象成员是const或者引用 #include <iost ...

  2. C++经典问题:如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B?

    对象成员特点总结: (1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数. (2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的 ...

  3. C++:用成员初始化列表对数据成员初始化

    1.在声明类时,对数据成员的初始化工作一般在构造函数中用赋值语句进行.  例如: class Complex{private:double real;double imag;public:Comple ...

  4. 为什么不能在子类的初始化列表里初始化父类的成员

    好几次遇到此类问题了:便不得不找些资料弄明白它: 具体代码是: 2 3 4 5 6 7 8 9 10 class A { protected:     int n_; }; class B : pub ...

  5. C++必须使用【初始化列表】初始化数据成员的三种情况

    类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员: 2.进入构造函数后在构造函数中执行一般赋值与计算. 使用初始化列表有两个原因: 原因1.必须这样做: < ...

  6. C++成员变量初始化列表中初始化顺序

    1.C++使用初始化列表初始化时,成员变量的初始化顺序:只与定义变量的顺序有关. #include <iostream> using namespace std; class A{ pri ...

  7. 子类初始化列表不能初始化父类元素 -- class 'Derived' does not have any field named 'x'

    缘由 偶尔编写如下代码,编译出错, class Base{public:int x; };class Derived : public Base {public:Derived() : x(10) { ...

  8. java 成员变量的初始化_Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...

  9. [面试] C++ 语法(一) —— 初始化列表的初始化顺序

    首先来看一道经典的 C++ 面试题: (1)初始化列表的初始化顺序:不是按照列表的顺序进行的 (2)初始化列表的初始化顺序:是按照内存模型中的成员变量的顺序(也即类声明的定义顺序)进行的: (3)也即 ...

最新文章

  1. jQuery URL Decoder Plugin
  2. 模式分类笔记--聚类分析算法
  3. 弹出确定_Redmi K30 Pro再剧透:弹出式全面屏,没有高刷
  4. 点击按钮显示div并向div中传递参数
  5. SAP Spartacus页面css类的赋值逻辑
  6. 来自女朋友的灵魂拷问!| 今日最佳
  7. php 图片不让下载,php让图片可以下载的方法
  8. Java面试——线程池
  9. usermod命令,用户密码管理,mkpasswd命令
  10. HDU - 5875 Function [单调性剪枝+预处理]
  11. 题目1512:用两个栈实现队列
  12. torch随机数 manual_seed
  13. MyBatis——MyBatis Generator插件使用(配置详解)
  14. 代理池篇(一)获取66免费代理网+西刺代理
  15. R语言和Python的区别
  16. 达摩院python教程视频_达摩院官方刚刚发布了最新的Python教程,整套427集系统学习视频...
  17. git pull时遇到的问题
  18. 水晶报表中如何创建自定义的纸张大小格式?
  19. 喜茶多肉瓜瓜 | 埃德珈奶茶饮品培训,饮品配方做法制作教程
  20. 对JSON中的key进行驼峰和下划线格式的相互转换

热门文章

  1. IntelliJ IDEA 中 右键新建时,选项没有Java class的解决方法和具体解释
  2. Python基础-变量作用域
  3. day 68 增删改查 语法
  4. 关于Vue2.0,Express实现的简单跨域
  5. 关于java的关键字 transient
  6. Safengine Android so加密
  7. PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。
  8. iOS 10 升级后无法真机测试 Could not find Developer Disk Image
  9. sql 创建用户脚本
  10. Hashtable的测试