C++初始化列表

来源:互联网 发布:网络筛子赌博技巧 编辑:程序博客网 时间:2024/06/05 22:32
我们为什么要用初始化成员列表,什么时候用初始化成员列表来初始化成员数据呢?Lippman的《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:
 
 
 
一,需要初始化的数据成员是对象的情况;
 
二,需要初始化const修饰的类成员;
 
三,需要初始化引用成员数据;
 
 
 
现在分别举例说明:
 
一,需要初始化的数据成员是对象。
 
---------------------------
 
#include <stdio.h>
 
class point
{
protected:
 int m_x,m_y;
public:
 point(int m=0,int n=0)
 {
  m_x = m;
  m_y = n;
  printf("constructor called!/n");
 }
 point(point& p)
 {
  m_x = p.GetX();
  m_y = p.GetY();
  printf("copy constructor called!/n");
 }
 int GetX()
 {
  return m_x;
 }
 int GetY()
 {
  return m_y;
 }
};
 
 
 
class point3d
{
private:
 point m_p;
 int m_z;
public:
 point3d(point p, int k)
 {
  m_p = p;                              //这里是对m_p的赋值
  m_z=k;
 }
 point3d(int i,int j, int k):m_p(i,j)   // 相当于 point m_p(i,j)这样对m_p初始化
 {
  m_z=k;
 }
 void Print()
 {
  printf("%d,%d,%d /n",m_p.GetX(),m_p.GetY(),m_z);
 }
};
 
---------------------------------------
 
上述代码中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)。
 
这也是我们在对成员数据是对象成员的采用初始化列表进行初始始化的主要原因。
本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-03/56284.htm
原创粉丝点击