c++中引用类型数据成员为什么不能在构造函数中赋值,而只能在成员初始化表中进行?

如题所述

构造函数可以分为两个阶段执行:(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) {} 效率相同。都正确。
温馨提示:内容为网友见解,仅供参考
无其他回答

c++中引用类型数据成员为什么不能在构造函数中赋值,而只能在成员初始化...
在执行构造函数A(int ii)时都要先初始化,再能执行构造函数体内的赋值。那么ci和ri如果不在初始化列表里初始化,是不能执行完初始化操作的。也就是说,初始化const或者引用类型数据成员的唯一机会就是在构造函数初始化列表中。所以上述构造函数可以写为 A::A(int ii) : ci(ii), ri(ii) {i ...

C++有哪几种情况只能用初始化列表,而不能用赋值?
赋值是删除原值,赋予新值,构造函数的意思是先开辟空间然后为其赋值,只能算是赋值,不算初始化;初始化列表就不一样了,开辟空间和初始化是同时完成的,直接给予一个值;常量不能被赋值,只能被初始化,所以必须在初始化列表中完成;C++的引用也一定要初始化,所以必须在初始化列表中完成。【1)引用必...

c++中构造函数,初始化列表和直接赋值有什么区别吗?
(1) 成员类型是没有默认构造函数的类。若没有提供显式初始化时,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。(2) const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。还有一个赋值次数,效率上的区别,初始...

c++中类的对象和成员变量的区别
局部变量,只能在定义的函数中访问 而C++中多出了成员变量,成员变量通常是私有。成员变量依附于对象存在,有了对象,成员变量才有内存 而成员变量的可以被本类的所有成员函数直接访问的。

c++类内构造函数指针初始化?
初始化与赋值虽皆使用等号,但用途不同。初始化通常用于数组的整体赋值,如 int a[2] = { 0, 1 }; 而赋值不支持此类操作。若成员变量是数组,也只能在初始化列表中进行数组初始化,如 ClassName() : member({ 0, 1 }) {}。否则,无法对数组进行列表初始化。为避免多次构造导致的时间开销,...

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值
如果该对象是全局的话,其成员中的内置类型就会自动初始化对应的默认值(像整形就为0)和调用构造函数初始化,如果是局部的话只会调用默认构造函数赋值,构造函数中没有涉及到的成员,并不会赋值。

C++中类成员初始化方式
初始化列表以冒号开始,后面列出需要赋值的成员变量及值。使用初始化列表的情况包括:成员变量为引用类型、数据成员为常量、父类构造函数有参数或成员变量所属类型构造函数有参数。在C++98中,就地声明允许在类声明中使用等号加初始值初始化静态成员常量。然而,就地声明的要求较高,静态成员必须是常量,且...

关于C++的初始化与赋值
确实是这个样子的.不过所谓初始化毕竟本身也可以理解为在变量使用之前进行适当的处理,所以在构造函数内用赋值来改变那些平常的变量可以认为是初始化.C++中事实上 =只能在变量声明时进行初始化,但是它的类特性偏偏又不允许在类体的成员变量声明中直接初始化(如果这样,代码本身就会非常不容易读),所以就创立...

C++参数问题
c语言里改变的只只能通过争取地址方式,进行传递,或许你会说传递数组就是传人递数组就是传递指针不是变值么,实际上,传递数组传递指针就是(或许对宿主来说,这个真有点特别)。\/\/注意:c里没有引用,C十十里才有,我们先来看一下有趣sWa函数。它用于交换a,b两个变量codeca了e1(1)#inc1Ude<...

C++构造函数如何进行初始化
因为const对象或引用类型只能初始化,不能对他们赋值。初始化数据成员与对数据成员赋值的含义是什么?有什么区别?首先把数据成员按类型分类并分情况说明:1.内置数据类型,复合类型(指针,引用)在成员初始化列表和C++构造函数体内进行,在性能和结果上都是一样的2.用户定义类型(类类型)结果上相同,...

相似回答
大家正在搜