在学习c++时,一直对必须使用初始化列表的情况说不全,或者说不清楚。今天来总结学习一下。

先回忆一下,必须使用初始化列表的情况
1.类数据成员为const类型
2. 类数据成员为引用类型
3.类没有默认的拷贝构造
4. 派生类的构造函数初始化列表必须调用基类的构造函数
  • const 数据成员
  1. class test
  2. {
  3. public:
  4. test()
  5. {
  6. cout << "constructor with argument\n";
  7. }
  8. private:
  9. const int i=10;
  10. };
结果编译错误:

原因:因为常量数据成员必须进行初始化,而不能被赋值。函数体内只能进行赋值,因此初始化列表是const数据成员初始化的唯一机会。
明确了两点:
  1. 只有静态常量成员才可以在类中初始化,如果没有在类内、类外初始化。则其会被初始化为0 或者 “空”(NULL或者string(“”))
  2. 非静态常量成员必须在初始化列表中完成
  3. 再需要注意的就是static成员可以在类中声明为任何的格式,但是数据成员定义必须在类的外部定义。与普通的数据成员不同,static成员不通过类构造函数进行初始化,而是应该在定义时进行初始化。
  • 引用类型的数据成员
 因为引用是一个对象的别名,因此必须进行初始化。而函数内部为初始化,不为赋值。因此初始化列表是其初始化的唯一机会。
  1. class test
  2. {
  3. public:
  4. test()
  5. {
  6. cout << "constructor with argument\n";
  7. cout << i <<endl;
  8. }
  9. private:
  10. int& i;
  11. //static int j;
这里如果没有给出初始化列表,编译失败。

编译器提示,i必须在构造函数初始值列表中初始化。
笔者在此做了一个有趣的测试,如果将引用类型改为静态的数据成员,那么还需要进行初始化列表吗?
  1. class test
  2. {
  3. public:
  4. test()
  5. {
  6. cout << "constructor with argument\n";
  7. cout << i <<endl;
  8. }
  9. private:
  10. static int& i;
  11. static int j;
  12. };
  13. int test::j = 10;
  14. int& test::i = j;
结果可以看出,如果成员类型为静态的引用类型,则应该按照静态数据成员对待。需要在类定义体外进行定义并初始化。

  • 如果类没有默认构造函数

    1. class Base
    2. {
    3. public:
    4. Base(int a) : val(a) {}
    5. private:
    6. int val;
    7. };
    8. class A
    9. {
    10. public:
    11. A(int v) : p(v), b(v) {}
    12. void print_val() { cout << "hello:" << p << endl;}
    13. private:
    14. int p;
    15. Base b;
    16. };
因为当类数据成员没有默认的构造函数时,在另一个类中声明了该变量(Base)。如果不用初始化列表构造,则其编译失败,因为其没有参数,无法进行构造。
  • 如果存在继承关系,派生类中必须在其初始化列表中调用基类的构造函数
在看effective C++的时候,其中有一条 复制对象时勿忘其每一个成分  Copying函数应该确保复制“对象内的所有成员变量” 及“所有base成分”

  1. class Base
  2. {
  3. public:
  4. Base(int a) : val(a) {}
  5. private:
  6. int val;
  7. };
  8. class A : public Base
  9. {
  10. public:
  11. A(int v) : p(v), Base(v) {}
  12. void print_val() { cout << "hello:" << p << endl;}
  13. private:
  14. int p;
  15. };
再看一个例子,关于Copy函数应注意的地方

  1. class Base
  2. {
  3. public:
  4. Base(int j):i(j)
  5. {
  6. cout << "constructor with argument\n";
  7. int p = 20;
  8. i = p;
  9. cout << i <<endl;
  10. }
  11. private:
  12. int i;
  13. };
  14. class Derive: public Base
  15. {
  16. public:
  17. Derive(int i ):Base(i),_i(i)
  18. {
  19. }
  20. Derive(const Derive &d):Base(d),_i(d._i)
  21. {
  22. }
  23. Derive& operator=(const Derive& d)
  24. {
  25. Base::operator=(d);
  26. _i = d._i;
  27. return *this;
  28. }
  29. private:
  30. int _i;
  31. };
在这个例子中我们可以看到,派生类中的拷贝构造函数对的初始化列表调用了基类构造函数进行初始化。在赋值构造函数中也调用了基类的赋值构造函数对基类部分进行构造。

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/chengkeke/p/5417352.html

必须使用初始化列表的情况相关推荐

  1. 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?

    初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...

  2. 构造函数中,成员变量一定要通过初始化列表来初始化的几种情况(转载)

    1.参考博客 博客链接1 博客链接2 2.实例如下 class A { ... private:int a; }; class B : public A { ... private:A &aa ...

  3. 必须采用初始化列表一共有三种情况

    有一个类B继承自类A,他们数据成员如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class A { - private: int &a; }; class B ...

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

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

  5. C++中必须用初始化列表的四种情况

    初始化列表 1. 类成员为const类型 2 . 类成员为引用类型 3.没有默认构造函数的类类型 4. 如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数 1. 类成员为const类型 ...

  6. 派生类参数初始化列表和基类构造函数顺序

    今天被问到了一个问题,随便回了一句,父类还没有构建,怎么能初始化父类的成员. 派生类构造函数的参数初始化列表,为什么不能初始化基类的成员? 例如下面的是不可以的 class Rectangle : p ...

  7. C++ 类构造函数初始化列表介绍

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

  8. C++类构造函数初始化列表

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample { public:     int a;     f ...

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

    <C++ Primer>中提到在以下三种情况下需要使用构造函数初始化列表: 需要初始化的类的成员变量是对象的情况: 需要初始化的类的成员变量由const修饰的或初始化的类的引用成员变量: ...

最新文章

  1. angularJs的学习笔记-01(创建项目)
  2. 每张脸值5美元,谷歌花钱买数据强化刷脸,还把隔空操控手机变成现实
  3. Oracle DBlink相关
  4. 推荐20个很有帮助的 Web 前端开发教程
  5. leetcode : 基础技巧
  6. How does SAP OData framework interpret $expand=Notes
  7. 初学者指南:如何为Red Hat Process Automation Manager配置电子邮件服务任务
  8. 合肥特殊教育中专学校计算机,安徽省特殊教育中专学校
  9. 使用特征_R语言-使用caret包实现特征选择:递归特征消除(RFE)算法
  10. bytes数组转string指定编码_一篇文章弄懂Python中所有数组数据类型
  11. Atitit 微服务之道 attilax著 1. 什么是微服务架构? 1 1.1. 、微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现 2 1.2. 微服务与康威定律 2 1
  12. 面试:list集合去重
  13. 实战|朝阳医院药品销售分析案例
  14. 系统自带测试软件,无需鲁大师检测!Windows自带工具检查系统健康度
  15. 台式计算机cpu允许温度,台式机cpu温度多少正常 台式电脑工作时温度范围
  16. 域名含义解释查询_域名含义解释查询
  17. Cookie、Session 简述
  18. 简述空串和空格串(或称空格符串)的区别。
  19. [游戏]求生之路新地图下载安装说明
  20. 现代密码学-密码学概论与基本知识

热门文章

  1. python gifmaze_Windows平台python验证码识别
  2. 计算机网络课程设计之网络嗅探器的设计与实现
  3. 小爱同学app安卓版_小爱课程表3.0全新升级 课表倒入更简单所有手机能用
  4. python爱因斯坦的问题_爱因斯坦的思考题.py
  5. Qt笔记-profile中基本配置(获取环境变量、设置生成路径、包含文件)
  6. canvas笔记-closePath函数的使用(含例子)
  7. Java高级语法笔记-文件读写(2)
  8. C/C++轻松实现文件下载
  9. c++ mysql 操作_c++操作mysql入门详解
  10. Python实现HTTP服务器(四)单进程线程非阻塞实现多任务