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]