eriol 发表于 2013-2-5 02:14:40

C++初始化成员列表

C++在类的构造函数中,可以两种方式初始化成员数据:

[*]在构造函数的实现中,初始类的成员数据。
[*]还可以定义初始化成员列表 (Initializer list) 来初始化成员数据。
 
那么我们在什么情况下该使用初始化成员列表呢?

[*]需要初始化的数据成员是对象。
[*]需要初始化的类成员是const对象或者引用对象。
[*]解决没有默认构造函数的类成员对象的生成。
[*]在继承里面,只有初始化列表可以构造父类的private成员。
 
 
1. 需要初始化的数据成员是对象。
 
#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;      }      point(point& p)      {            m_x = p.GetX();            m_y = p.GetY();      }      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_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);         }}; 
   我们可以使用如下进行初始化,它将调用拷贝构造函数:
   关于拷贝构造函数,可参见 http://www.cnblogs.com/BlueTzar/articles/1223313.html
 
void main(){    point p(1,2);    //先定义一个2D坐标    point3d p3d(p,3);    p3d.Print();} 
   也可以使用初始化成员列表进行初始化:
 
void main(){    point p(1,2);    point3d p3d(1,2,3);    p3d.Print();} 
   由于对象赋值比初始化要麻烦的多,因此也带来的性能上的消耗。所以使用初始化列表可以更高效地初始化成员变量是对象的情况。
 
 
2. 需要初始化的类成员是const对象或者引用对象。
 
对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,、因此只能用初始化列表对其进行初始化。
 
#include <stdio.h>class base{    private:      const int a;      int& b;    public:         // base(int m, int n)         // {         //a = m;         //b = n;         // }         base(int m, int n):a(m),b(n)         {}}; void main(){    base b(1,2);} 
其中,注释的部分将无法通过编译。
 
 
3. 解决没有默认构造函数的类成员对象的生成。
 
如果成员类型是没有默认构造函数的类。若没有提供显示初始化,则编译器隐式使用成员类型的默认构造函数,若该类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
 
 
4. 在继承里面,只有初始化列表可以构造父类的private成员。
 
 
原文地址:http://blog.csdn.net/freedom0203/article/details/2805945
页: [1]
查看完整版本: C++初始化成员列表