首页 > 试题广场 >

构造函数中,成员变量一定要通过初始化列表来初始化的是

[单选题]
有一个类A,其数据成员如下:
class A {
...
private:
     int a;
public:
     const int b;
     float* &c;
     static const char* d;
     static double* e;
};
则构造函数中,成员变量一定要通过初始化列表来初始化的是:______。
  • a b c
  • b c
  • b c d e
  • b c d
  • b
  • c
B
构造函数中,成员变量一定要通过初始化列表来初始化的有以下几种情况:
1、const常量成员,因为常量只能在初始化,不能赋值,所以必须放在初始化列表中;
2、引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表中;
3、没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数;
编辑于 2015-08-24 10:43:48 回复(3)
更多回答
推荐
选择B:
构造函数初始化时必须采用初始化列表一共有三种情况,  
1.需要初始化的数据成员是对象(继承时调用基类构造函数)  
2.需要初始化const修饰的类成员  
3.需要初始化引用成员数据
因为static属于类并不属于具体的对象,所以 static成员是不允许在类内初始化的,那么static const 成员是不是在初始化列表中呢?
答案是NO
一是static属于类,它在未实例化的时候就已经存在了,而构造函数的初始化列表,只有在实例化的时候才执行。
二是static成员不属于对象。我们在调用构造函数自然是创建对象,一个跟对象没直接关系的成员要它做什么呢
编辑于 2016-05-08 17:10:28 回复(15)
初始化从无到有,创建了新对象;如:string foo = "Hello World!"
赋值没有创建新对象,而是对已有对象赋值。 如:string bar; bar = "Hello World!"

有时我们可以忽略数据成员初始化和赋值之间的差异,但并非总能这样。
如果成员是const或者是引用的话,必须将其初始化。类似的,当成员属于某种类类型且该类没有定义默认构造函数时,也必须将这个成员初始化。(比如:类A中有一成员是B b,但类B中没有定义默认构造函数时,就必须对A中b成员进行初始化)

随着构造函数体一开始执行(即大括号里面部分),初始化就完成了(构造函数体内只是赋值操作)。因此,上面三种情况,比如初始化const或者引用类型的数据成员的唯一机会就是通过构造函数初始值,形如:ConstRef::ConstRef(int n) : i(n), j(n) { }
参考:C++ Primer(第五版)7.5.1 P258; http://www.cnblogs.com/kaituorensheng/p/3477630.html
编辑于 2016-12-20 14:51:24 回复(0)

    1,const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间

    2,static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。

    3,在C++中,static静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,如:double Account::Rate = 2.25;static关键字只能用于类定义体内部的声明中,定义时不能标示为static

    4,在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。

         const数据成员  只在某个对象生存期内是常量,而对于整个类而言却是可变的 因为类可以创建多个对象,不同的对象其const数据成员的            值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。

         const数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt。

发表于 2016-08-03 19:22:49 回复(0)
从C++11开始,这些问题都不成问题,除了初始化列表,还可以直接在类中定义时进行初始化,包括引用成员和const成员。
发表于 2017-06-06 17:22:55 回复(0)
规定引用和const常量都必须通过初始化列表来初始化,而static变量在程序
发表于 2015-08-24 16:00:10 回复(0)
弱弱地问一句,a为什么不需要呢?
编辑于 2016-05-16 10:36:00 回复(2)
c是引用 如果不是引用的话就不用了……
发表于 2019-09-20 08:22:36 回复(0)

类对象 常量 应用 c是引用

发表于 2019-07-18 18:37:25 回复(0)
static const char* d;就算把static去掉变成
const char* d; 也不需要在初始化列表中初始化。
因为d是常量指针,d是可变的,d指向的变量不可变。
发表于 2019-06-06 17:15:27 回复(0)
构造函数初始化时必须采用初始化列表一共有三种情况,   
1.需要初始化的数据成员是对象(继承时调用基类构造函数)   
2.需要初始化const修饰的类成员   
3.需要初始化引用成员数据
因为static属于类并不属于具体的对象,所以 static成员是不允许在类内初始化的,那么static const 成员是不是在初始化列表中呢?
答案是NO
一是static属于类,它在未实例化的时候就已经存在了,而构造函数的初始化列表,只有在实例化的时候才执行。
二是static成员不属于对象。我们在调用构造函数自然是创建对象,一个跟对象没直接关系的成员要它做什么呢
发表于 2018-08-18 10:00:49 回复(0)
a为什么不用
发表于 2018-07-14 10:49:11 回复(0)
构造函数,成员变量一定要通过初始值列表进行初始化有三种情况:
1 成员变量是const类型
2 成员变量是引用类型,(int * &iref=*i 指针的引用)
3 成员变量是某种未提供默认构造函数的类类型
初始化和赋值的区别
对于类的成员变量,在构造函数体内对成员变量进行的是赋值,而在构造函数初始值列表上进行的是初始化
static修饰的成员变量需要在类体外单独初始化,因为static修饰的变量不属于某个对象所特有,而是属于该类。
发表于 2018-05-19 13:13:26 回复(0)
对象,constant,引用三种需在构造函数初始化列表初始化
编辑于 2018-04-05 17:01:55 回复(0)
只学c没学cpp的好蛋疼
发表于 2017-10-23 10:17:20 回复(0)
静态数据成员属于类的成员,必须在类之外初始化
发表于 2017-09-03 22:26:54 回复(0)
构造函数初始化时必须采用初始化列表一共有三种情况,   
1.需要初始化的数据成员是对象(继承时调用基类构造函数)   
2.需要初始化const修饰的类成员   
3.需要初始化引用成员数据
因为static属于类并不属于具体的对象,所以 static成员是不允许在类内初始化的,那么static const 成员是不是在初始化列表中呢?
答案是NO
一是static属于类,它在未实例化的时候就已经存在了,而构造函数的初始化列表,只有在实例化的时候才执行。
二是static成员不属于对象。我们在调用构造函数自然是创建对象,一个跟对象没直接关系的成员要它做什么呢
发表于 2017-07-05 15:24:03 回复(0)
staticconstchar* d
d是静态变量,需要在类外显示初始化,并且不需要加static
const char *  A::d = 相应对象;

编辑于 2017-06-06 16:52:09 回复(0)
static属于类,而不是属于具体创建的对象。
发表于 2017-04-09 12:07:34 回复(0)
选择B: 构造函数初始化时必须采用初始化列表一共有三种情况,   1.需要初始化的数据成员是对象(继承时调用基类构造函数)   2.需要初始化const修饰的类成员   3.需要初始化引用成员数据 因为static属于类并不属于具体的对象,所以 static成员是不允许在类内初始化的,那么static const 成员是不是在初始化列表中呢? 答案是NO 一是static属于类,它在未实例化的时候就已经存在了,而构造函数的初始化列表,只有在实例化的时候才执行。 二是static成员不属于对象。我们在调用构造函数自然是创建对象,一个跟对象没直接关系的成员要它做什么呢
发表于 2017-01-25 12:33:33 回复(0)
yin yong zhizhen,sui shuo shi ge zhizhen ,dan hai shi taobuliao yinyong de xianzhi
发表于 2015-11-24 06:57:11 回复(0)