那我们为什么要用初始化成员列表,什么时候用初始化成员列表来初始化成员数据呢?Lippman的《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 
  
一,需要初始化的数据成员是对象的情况; 
二,需要初始化const修饰的类成员; 
三,需要初始化引用成员数据; 
  
现在分别举例说明: 
一,需要初始化的数据成员是对象。 
---------------------------

[cpp] view plaincopy
  1. #include <stdio.h>
  2. class point
  3. {
  4. protected:
  5. int m_x,m_y;
  6. public:
  7. point(int m=0,int n=0)
  8. {
  9. m_x = m;
  10. m_y = n;
  11. printf("constructor called!/n");
  12. }
  13. point(point& p)
  14. {
  15. m_x = p.GetX();
  16. m_y = p.GetY();
  17. printf("copy constructor called!/n");
  18. }
  19. int GetX()
  20. {
  21. return m_x;
  22. }
  23. int GetY()
  24. {
  25. return m_y;
  26. }
  27. };
  28. class point3d
  29. {
  30. private:
  31. point m_p;
  32. int m_z;
  33. public:
  34. point3d(point p, int k)
  35. {
  36. m_p = p;                              //这里是对m_p的赋值
  37. m_z=k;
  38. }
  39. point3d(int i,int j, int k):m_p(i,j)   // 相当于 point m_p(i,j)这样对m_p初始化
  40. {
  41. m_z=k;
  42. }
  43. void Print()
  44. {
  45. printf("%d,%d,%d /n",m_p.GetX(),m_p.GetY(),m_z);
  46. }
  47. };

--------------------------------------- 
上述代码中Point3d是一个3D坐标,他有一个point的2D坐标和一个成员组成。 
我们现在想定义一个3D坐标p3d,可以这样实现: 
void main() 

 point p(1,2);    //先定义一个2D坐标 
 point3d p3d(p,3); 
 p3d.Print(); 

从point3d实现体可以看出,我们是通过对m_p进行赋值,这样不仅调用copy constructor产生临时对象而且是对m_p的一个赋值操作。 
而如果使用成员初始化列表,我们则可以这样: 
void main() 

 point p(1,2); 
 point3d p3d(1,2,3); 
 p3d.Print(); 

p3d中的point型成员是通过调用初始化的方式构建的。由于对象赋值比初始化要麻烦的多,因此也带来的性能上的消耗。(可以参见Scott Meyers著《effective C++》条款12)。 
这也是我们在对成员数据是对象成员的采用初始化列表进行初始始化的主要原因。 
  
二,需要初始化const修饰的类成员; 
三,需要初始化引用成员数据; 
对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起)因此只能用初始化列表对齐进行初始化。 
上面两点比较好明白,可以用一个例子加以说明: 
-------------------------------------

[cpp] view plaincopy
  1. #include <stdio.h>
  2. class base
  3. {
  4. private:
  5. const int a;
  6. int& b;
  7. public:
  8. // base(int m, int n)
  9. // {
  10. //  a = m;
  11. //  b = n;
  12. // }
  13. base(int m, int n):a(m),b(n)
  14. {}
  15. };
  16. void main()
  17. {
  18. base ba(1,2);
  19. }

c++ 成员初始化列表相关推荐

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

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

  2. Cpp 对象模型探索 / 成员初始化列表

    目录 一.何时必须使用? 二.优势 三.细节探究 一.何时必须使用? 成员变量是 const 类型. 成员变量是引用. 基类中含有带形参的构造函数且不存在默认的构造函数. 成员变量是类对象,该对象含有 ...

  3. C++中成员初始化列表的使用

    C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point { private:  int x,y; pu ...

  4. lt;转载自刘佳ID:freedom0203和waretgt; C++中成员初始化列表的使用

    刘佳: C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point { private:  int x,y ...

  5. C++ 语法之【成员初始化列表】

    C++ 语法之[成员初始化列表] 类对象构造过程 定义[成员初始化列表] 必须使用[成员初始化列表]的情况 情况一:const类成员或者被声明为引用的类成员 情况二:初始化成员是对象(包含继承) 情况 ...

  6. C++成员初始化列表

    C++类成员初始化列表 C++类型定义 C++构造函数的初始化列表定义 C++构造函数执行的两个阶段:初始化阶段和计算阶段 为什么使用初始化列表 C++里面哪些东西必须放在初始化列表里面 成员变量的初 ...

  7. C++ 类(构造函数的成员初始化列表)

    文章概述 构造函数的成员初始化列表 构造函数的成员初始化列表 下面的代码分析了什么时候使用成员初始化列表: class A {private:int a;public:A(int a){this-&g ...

  8. C++学习笔记:成员初始化列表【Cherno】

    先带着几个问题来看文章: 为什么要有初始化列表.怎么写初始化列表,初始化列表的好处是什么: 1:为什么要有初始化列表: 很简单,为了提高效率和C++风格化,先说C++风格化,如果我们要在一个构造函数中 ...

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

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

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

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

最新文章

  1. oauth过滤login_OAuth2AuthenticationProcessingFilter资源认证服务器过滤器
  2. 使用 .NET 实现 Ajax 长连接 (Part 1 - Comet Web Service)
  3. java模型给泛型_java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
  4. 面向dba的linux shell 脚本简介,面向 DBA 的 Linux Shell 脚本简介
  5. Combox使用的一些技巧
  6. Intellij Idea搭建Spark开发环境
  7. 第一百一十三期:去伪存真,区块链应用到底能解决什么实际问题?
  8. Layui的轮播事件和echarts插件事件
  9. Linux中关机,重启,注销命令
  10. Sublime 常用操作
  11. F - Pasha and Phone CodeForces - 595B(数学)
  12. 基于python的证件照_利用python自动生成证件照
  13. c4d r21中文语言包安装失败怎么办,Windows10系统下语言包安装失败的解决方案
  14. (附源码)node.js物资管理系统 毕业设计 071130
  15. 前端开发之抽屉热搜榜
  16. note2刷 android 5.0.2,三星Galaxy Note Pro 12.2 Android 5.0.2更新锁定了竞争对手的键盘
  17. pythonapp自动化_基于python的App UI自动化环境搭建
  18. Android手机app启动的时候第一个Activity必须是MainActivity吗
  19. 春招必看一位老学长的真实互联网校招求职心路历程~
  20. uni-app开发的h5,使用微信授权登录(前置条件+具体代码)

热门文章

  1. 前端打印ip地址_赶紧收藏 | 前端应该会的23个linux常用命令
  2. python 制作网页 选择题_python爬取网页电子课本图片,自己制作可打印的课本文件...
  3. python画叮当猫_怎么画卡通哆啦A梦(机器猫、蓝胖子、叮当猫) 专家详解
  4. c语言输入身高计算标准体重_体质测试 | 身高 / 体重测试评分标准及方法
  5. java exception 级别_Java异常体系概述
  6. 计算机辅助英语教学 研究背景,计算机辅助外语教学中的教师角色研究
  7. java实现5 4 3 2 1递归_递归及递归的使用
  8. redis报错: redis.exceptions.ResponseError: value is not an integer or out of range
  9. 初级算法15.有效的字母异位词
  10. ubuntu MySQL的卸载