首先,运行下图中的C++代码,输出是什么?

class A
{
private:int n1;int n2;
public:A(): n2(0) , n1(n2 + 2){}void Print(){cout<<"n1:"<<n1<<",n2:"<<n2<<endl;}
};
int main(void)
{A a;a.Print();return 0;
}

答案:输出n1是一个随机的数字,n2为0。在C++中,成员变量的初始化顺序与变量在类型中的声明顺序相同,而与它们在构造函数的初始化列表中的顺序无关。因此在这道题中,会首先初始化n1,而初始n1的参数n2还没有初始化,是一个随机值,因此n1就是一个随机值。初始化n2时,根据参数0对其初始化,故n2=0。
        构造函数的初始化列表仅仅指定用于初始化成员的值,并不指定这些初始化执行的次序。成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推。也就是说,C++编译器很容易得到构造函数的参数列表,获取参数,然后根据成员变量的声明顺序初始化成员变量(这是因为,后声明的变量有可能依赖先声明的成员变量,因此要有先声明先初始化,后声明的后初始化)。
        大家可能看到这里就会觉得,好麻烦啊,当类中的一个数据成员是根据其他数据成员而初始化的时候,初始化列表的次序不能跟成员变量的声明次序不一致,否则会出现不可预料的错误。
    的确是这样的,所以有人就会想到,我干脆把初始化列表的那些操作都放到构造函数的函数体内对数据成员进行赋值操作就行了,的确这样做是可以的,但是有时构造函数的初始化列表是必须的。
    有些数据成员必须在构造函数初始化列表中进行初始化。对于这样的成员,在构造函数体内对它们赋值是不起作用的。没有默认构造函数的类类型的成员,以及const类型的成员变量和引用类型的成员变量,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。
    例如,下面的构造函数定义就是错误的:

class A
{
private:int i;const int j;int &k;
public:A(int ii){i = ii;j = ii;k = ii;}
};

 记住,可以初始化 const 对象或引用类型的对象,但不能对它们赋值。在开始执行构造函数的函数体之前,要完成初始化,初始化 const 或引用类型的数据成员的唯一机会就是在构造函数的初始化列表中。
      例如,下面的构造函数定义就是正确的:

class A
{
private:int i;const int j;int &k;
public:A(int ii) : i(ii) , j(i) , k(ii){}A() : j(0) , k(i){ }
};int main(void)
{A a;return 0;
}

构造函数的初始化列表相关推荐

  1. C++远航之封装篇——默认构造函数、初始化列表、拷贝构造函数

    1.默认构造函数 没有参数: 若有参数,则一定全部都有默认的参数值. 2.初始化列表 (1)概念 (2)特性 建议用初始化列表来初始化数据成员. 初始化列表先于构造函数执行: 初始化列表只能用于构造函 ...

  2. C++构造函数之初始化列表

    C++构造函数之初始化列表 构造函数可以说是对于C++每个类来说最重要的组成部分,之前也详细介绍过构造函数的相关知识,今天给构造函数进行补充,主要说明一下构造函数的初始值列表 一.初始化列表的写法 仍 ...

  3. C++ 构造函数的初始化列表

    (1)如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数.这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化 ...

  4. C++:构造函数之初始化列表

    初始化列表有什么用? 在不知道初始化列表的时候我可以在构造函数体内进行初始化,就是对成员变量赋值.为什么还需要初始化列表? 这是因为,有些类型的数据无法通过在构造函数体内进行赋值来进行初始化.这样的数 ...

  5. C++构造函数的初始化列表

    1.有三种情况下是一定要用初始化列表的,单类的数据成员里面有const成员,或者有数据成员是引用,或者有没有默认构造函数的类成员.const和引用成员可以被初始化,但不可以被赋值.而如果一个类成员没有 ...

  6. c++构造函数成员初始化中赋值和初始化列表两种方式的区别

    先总结下: 由于类成员初始化总在构造函数执行之前 1)从必要性: a. 成员是类或结构,且构造函数带参数:成员初始化时无法调用缺省(无参)构造函数 b. 成员是常量或引用:成员无法赋值,只能被初始化 ...

  7. C++类构造函数初始化列表及初始化成员变量的误区

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: [cpp] view plaincopy class CExample { pub ...

  8. c++初始化成员列表_C++ 类构造函数初始化列表

    关注我们更多精彩等你发现! 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: 上面的例子中两个构造函数的结果是一样的.上面的构造函数 ...

  9. 构造函数后面的冒号后初始化列表

    多个初始化之间用逗号隔开,另外初始化是按照参数声明的顺序,而不是按照你写得顺序进行初始化的. 条款12:   尽量使用初始化而不要在构造函数里赋值         看这样一个模板,它生成的类使得一个名 ...

最新文章

  1. numpy 的基本使用1
  2. Java线程--扩展
  3. pandora固件运行c语言,潘多拉固件设置单线多播教程
  4. 如何自定义TCP通信协议
  5. win10系统驱动备份及还原-命令行操作
  6. 电力电子pwm控制技术
  7. [转载]世界各国语言文字举例
  8. 【excel】利用NETWORKDAYS.INTL函数计算两日期之间的工作日时间
  9. 记一次k8s pod频繁重启的优化之旅
  10. 我的世界服务器搭建原理,我的世界自动化农场的建造与原理 这里有你想知道的...
  11. 聚点 内部 内点 导集
  12. 通信基础概念(三)相关与正交
  13. 正整数 n 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大
  14. 软件工程导论课程作业——网上二手书店需求分析
  15. 长沙理工大学教务管理系统模拟登陆
  16. 《PMP学习笔记》1.2 财务评价指标
  17. BZOJ 1787 [Ahoi2008]Meet 紧急集合——LCA
  18. spark源码分析之UnsafeShuffleWriter
  19. 食神摇摇中图片的晃动效果
  20. 电容式液位开关与浮球式液位开关的区别

热门文章

  1. 华为MSTP配置教程(二)
  2. python开源项目及示例代码
  3. 今天收到了学校给出的退学警告
  4. 聊聊rocketmq的RemotingException
  5. python3--装饰器
  6. Web中的XHRHttpRequest
  7. android-async-http使用例子
  8. java web 程序---购物车项目内容:
  9. 【UIKit】UITableView 1
  10. log4j配置报错:ERROR Failed to load driver.ClassNotFoundException.