构造函数初始化成员变量问题

来源:互联网 发布:触摸屏播放软件 编辑:程序博客网 时间:2024/05/21 09:46
请问在构造函数中使用初始化清单和直接在构造函数内初始化成员变量有什么区别?
比如:
    construct_function():var1(1),var2(2),var(3)
    {}
    和
    construct_function()
    {
        var1 = 1;
        var2 = 2;
        var3 = 3;
    }
有没有什么本质区别?



construct_function():var1(1),var2(2),var(3)
{}
初始化
construct_function()
{
var1 = 1;
var2 = 2;
var3 = 3;
}赋值
要是const类型的话只能使用初始化

是这个意思:
首先把数据成员按类型分类
1。内置数据类型,复合类型(指针,引用)
2。用户定义类型(类类型)

分情况说明:
对于类型1,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
对于类型2,结果上相同,但是性能上存在很大的差别
因为类类型的数据成员对象在进入函数体是已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,这是调用一个构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)

举个例说明
class A;
class B
{public:
B(){a = 3;}
private:
A a;
}

class A
{public:
A(){}
A(int){value = 3;}
int value;
}

像上面,我们使a对象的value为3,调用一个A的构造函数+一个默认拷贝赋值符,才达到目的
B::B():a(3){}
像这样,只调用了一个构造函数就达到了所需的对象啦,所以性能好的

对于const成员,无缺省构造函数的类对象成员,均需放在成员初始化列表

【suprwx】:
对于对象类型:

直接在构造函数里初时化执行了两步:
1 调用对象类型的无参构造函数完成初始化
2 调用对象类型的拷贝构造函数进行赋值

在初始化列表里初始化只执行2

【todototry】:
class A
{
public:
A(int i){}
};

class B
{
public:
B() : ci(3), a(3){}
private:
const int ci;
A a;
};

int main()
{
B b;
return 0;
}

【todototry】:
上面给的这句话的例程
对于const成员,无缺省构造函数的类对象成员,均需放在成员初始化列表


!!!!!!!!!!总之用成员初始化表来初始化成员就是为了提高效率,但只有类拥有成员类对象时才有效果

所以如果你的类里面没有成员类对象,两种初始化方式效率是一样的
!!
原创粉丝点击