文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>初始化列表与构造函数

初始化列表与构造函数

时间:2010-09-18  来源:zyd_cu

类的成员可通过初始化列表的方式初始化,还可以在构造函数体内进一步进行赋值。除了const,引用类型的成员必须使用初始化列表的方式,对于简单的类,这两种方式基本上没有什么差别。但对于复杂的类(类中包含其它类的成员等),两种方式在效率上有很大的不同。

 

如果D类中包含B类的对象,D的构造函数调用之前,会先构造B类的对象(根据参数不同,调用B类相应的构造函数),如果构造函数体内还有对B类的赋值操作,则B类的赋值运算会被调用。但直接使用初始化列表的方式构造基类对象,则只会调用拷贝构造函数一次,如下例所示:


 

#include <iostream>
using namespace std;

class Base
{
public:
    Base(int x = 1)
    {
        cout << "Constructor" << endl;
        this->x = x;
    }
    Base(const Base& b)
    {
        cout << "Copy Constructor" << endl;
        this->x = b.x;
    }
    Base& operator = (Base& b)
    {
        cout << "Assignment" << endl;
        this->x = b.x;
        return *this;
    }

private:
    int x;
};

class Derive
{
public:
// Code1
/*
    Derive(Base a = Base(1))
    {
        this->b = a;
    };
*/


//Code2
    Derive(Base a = Base(1)): b(a)
    {
    }

private:
    Base b;
};

int main()
{
    Derive d;
}

 

如果使用Code1,即在构造函数体内赋值,会输出:

Constructor    /* 对应临时对象Base(1) */

Constructor    /* 构造函数被调用 */

Assignment    /* 赋值操作 */

 

如果使用Code2,即使用初始化方式,会输出:

Constructor    /* 对应临时对象Base(1) */

Copy-Constructor  /* 拷贝构造函数被调用 */

 

如果类中包含很多复杂的类,则两种方式的效率差别会非常的明显,所以尽量使用初始化方式,而不要在构造函数体内赋值。


 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载