六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 162|回复: 0

C++初始化成员列表

[复制链接]

升级  82%

49

主题

49

主题

49

主题

秀才

Rank: 2

积分
173
 楼主| 发表于 2013-2-5 02:14:40 | 显示全部楼层 |阅读模式
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
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表