c++ 成员初始化列表

转载 2016年08月29日 11:00:52
那我们为什么要用初始化成员列表,什么时候用初始化成员列表来初始化成员数据呢?Lippman的《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 
  
一,需要初始化的数据成员是对象的情况; 
二,需要初始化const修饰的类成员; 
三,需要初始化引用成员数据; 
  
现在分别举例说明: 
一,需要初始化的数据成员是对象。 
--------------------------- 
[cpp] view plain copy
  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.     
  29. class point3d   
  30. {   
  31. private:   
  32.  point m_p;   
  33.  int m_z;   
  34. public:   
  35.  point3d(point p, int k)   
  36.  {   
  37.   m_p = p;                              //这里是对m_p的赋值   
  38.   m_z=k;   
  39.  }   
  40.  point3d(int i,int j, int k):m_p(i,j)   // 相当于 point m_p(i,j)这样对m_p初始化   
  41.  {   
  42.   m_z=k;   
  43.  }   
  44.  void Print()   
  45.  {   
  46.   printf("%d,%d,%d /n",m_p.GetX(),m_p.GetY(),m_z);   
  47.  }   
  48. };   

--------------------------------------- 
上述代码中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 plain copy
  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.     
  17. void main()   
  18. {   
  19.  base ba(1,2);   
  20. }  
举报

相关文章推荐

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

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

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

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

C++为类中提供类成员的初始化列表(★firecat推荐★)

在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种: 第一种方法: CMYClass::CSomeClass() { x=0; y=1; } 第二种方法...

从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

一、构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化#include using namespace ...

从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

一、构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化  C++ Code  1 2 3 4 5...

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

C++中成员初始化列表的使用 分类: C/C++基础2008-08-21 11:52 6126人阅读 评论(4) 收藏 举报  C++在类的构造函数中,可以两种方式初始化成员数据(...

C++初始化成员列表,符合类,const修饰函数

C++ 初始化列表:成员变量的初始化  位置:构造函数函数头之后 以:开头,后面紧跟函数体 //初始化列表(初始化成员变量):声明变量同时初始化 //构造函数中:先声明变量再初始化 //1.c...

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

C++在类的构造函数中,可以两种方式初始化成员数据(data member)。 1,在构造函数的实现中,初始类的成员数据。诸如: class point { private:  int x,...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)