c++中引用类型数据成员为什么只能在成员初始化表中进行?

2024-11-25 20:43:10
推荐回答(2个)
回答1:

因为很多东西需要有初值,如果不给初值就会出问题,因为有些数据可能一开始不进行任何赋值就用,如果这个值不是预想的值,那就可能出问题,最简单的就是比如编程中常用的控件timer,这个控件你不给初值,他一开始就会计时,你如果不想这样,就必须赋个初值enabled=false,包括他的定时间隔你通常也需要先给一个值,包括你打游戏时,你不希望你辛辛苦苦练的号下次玩从0级开始吧,那这在编程中通常都要在构造函数中对数据付初值。。。。
但这不是说你所有的数据都要有给初始值,如果不初始化不会出问题,那是可以不给初始值,这些你真正编成的时候就知道了,如果给不给初始值还判断不了,那你离可以亲自编成的距离还很远。。。。

回答2:

构造函数可以分为两个阶段执行:(1)初始化阶段;(2)普通的计算阶段(即可以是那些赋值语句之类的。)
不管成员是否在构造函数初始化列表中显示初始化,类类型的成员总是在初始化阶段初始化。
比如这样一个class:
class
A
{
public:
A(int
ii);
private:
int
i;
const
int
ci;
int
&ri;
};
在执行构造函数A(int
ii)时都要先初始化,再能执行构造函数体内的赋值。
那么ci和ri如果不在初始化列表里初始化,是不能执行完初始化操作的。也就是说,初始化const或者引用类型数据成员的唯一机会就是在构造函数初始化列表中。
所以上述构造函数可以写为
A::A(int
ii)
:
ci(ii),
ri(ii)
{i
=
ii;}
补充一点:内置类型的成员不进行隐式初始化,所以上述成员i不需要在初始化阶段初始化,当然也可以初始化,只是不管是在初始化列表中初始化还是在函数体内赋值,其效率是一样的。即
A::A(int
ii)
:
ci(ii),
ri(ii)
{i
=
ii;}
与A::A(int
ii)
:
i(ii),
ci(ii),
ri(ii)
{}
效率相同。都正确。