首页 > 试题广场 >

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

[单选题]
有一个类B继承自类A,他们数据成员如下:
class A {
...
private:
   int &a;
};
class B : public A {
...
private:
     int a;
public:
     const int b;
     A c;
     static const char* d;
     A* e;
};
则构造函数中,成员变量一定要通过初始化列表来初始化的是____。
  • b c
  • b c e
  • b c d e
  • c e
  • b d
  • b e
推荐
常量成员和引用成员自然是要初始化的,问题就在这static成员。
static成员是不允许在类内初始化的,除了const,那么static const 成员是不是在初始化列表中呢?
答案是NO
一是static属于类,它在未实例化的时候就已经存在了,而构造函数的初始化列表嘞,只有在实例化的时候才执行。
二是static成员不属于对象。我们在调用构造函数自然是创建对象,一个跟对象没直接关系的成员要它做什么呢
还有一个问题就是上面那个仁兄说的,.需要初始化的数据成员是对象(继承时调用基类构造函数) ;这个显然是不对的。下面代码能够很好说明了这个问题。c需要初始化不是因为它是类对象,是因为他的成员有引用。
  1. class A {
  2. private:
  3.    int a;
  4. };
  5. class B : public A {
  6. private:
  7.      int aa;
  8. public:
  9. B(int i ):aa(i),b(9){};
  10.      const int b;
  11.      A c;
  12. };
编辑于 2016-03-24 15:29:10 回复(24)
我认为c不需要列表初始化啊,
如图
class A 
{
public:
	A():a(aa) {}
private:
		int aa;
		int &a;
};
class B : public A 
{
private:
	int a;
public:
	B():b(2333){}
	const int b;
	A c;
	static const char* d;
	A* e;
};

发表于 2016-09-16 17:03:31 回复(0)
前面几位已经说得很好了,我亲自试了试,并总结了一下。
在构造函数中需要初始化列表初始化的有如下三种情况 1.带有const修饰的类成员 ,如const int a ;
2.引用成员数据,如 int& p;
3.带有引用的类变量,如: class A {
private:
       int &a;
};
class B{
private:
  A c;
}
这里的c需要用初始化列表进行初始化。 class A {
private:
int &a;
int b;
public:
A():a(b){}
};

class B : public A {
public:
B(A ac)
:b(10),
A(c)
{
}
private:
int a;
public:
const int b;
A c;
static const char* d;
A* e;
};

发表于 2015-08-30 21:40:17 回复(3)
static 修饰的变量在类外初始化,const修饰的在参数列表初始化
在构造函数中需要初始化列表初始化的有如下三种情况 
1.带有const修饰的类成员 ,如constinta ;
2.引用成员数据,如 int& p;
3.带有引用的类变量(如题目的对象c)
发表于 2016-03-26 11:54:52 回复(5)
构造函数初始化时必须采用初始化列表一共有三种情况,
1.需要初始化的数据成员是对象(继承时调用基类构造函数)
2.需要初始化const修饰的类成员
3.需要初始化引用成员数据
发表于 2015-08-26 22:11:53 回复(4)
本题的考点是引用和常量都必须要在定义的时候初始化的。因为定义以后,其值将不再改变。

发表于 2015-09-27 09:48:26 回复(0)
共四种情况,分两种讨论    大家还是自己敲敲   你会懂得更多
//第一种情况       自己类中的引用成员变量,const 修饰的成员变量必须在自己类的初始化列表初始化,
//第二种情况        父类中不存在默认构造函数
//如果非继承关系,类B中包含类A对象,类A无默认构造函数时,此时类B需要对类对象进行初始化列表初始化,
//当然,如果类A有默认构造函数,类B不需要对类对象进行初始化
//如果有继承关系,父类中没有默认构造函数,那么子类在初始化列表当中,一定要对父类的构造函数进行初始化
发表于 2019-04-07 12:50:08 回复(0)
static 修饰的变量在类外初始化,const修饰的在参数列表初始化
在构造函数中需要初始化列表初始化的有如下三种情况 
1.带有const修饰的类成员 ,如constinta ;
2.引用成员数据,如 int& p;
3.带有引用的类变量(如题目的对象c)
做一下笔记

发表于 2017-11-03 09:52:17 回复(0)
static 修饰的变量在类外初始化,const修饰的在参数列表初始化 在构造函数中需要初始化列表初始化的有如下三种情况  1.带有const修饰的类成员 ,如constinta ; 2.引用成员数据,如 int& p; 3.带有引用的类变量(如题目的对象c) 做一下笔记
编辑于 2018-04-03 07:43:47 回复(0)
const;
&;
带有& 的类变量
发表于 2017-11-28 21:26:57 回复(0)
常量和引用必须初始化,所以b和c需初始化
d:底层const,允许改变d的值,亦可不必初始化
e:允许改变e的值
发表于 2017-04-26 11:22:27 回复(0)
上张干货表:一目了然。

        初始化方式                                    类内(声明)                类外(实现文件)                构造函数中                构造函数的初始化列表
类型
非静态非常量数据成员                                        N                                   N                                                 Y                                             Y

非静态常亮数据成员                                             N                                   N                                                  N                                            Y(must)
    
静态非常量数据成员                                            N                                   Y(must)                                        N                                             N
  
静态常亮数据成员                                                  Y                                   Y                                                  N                                             N
发表于 2017-03-20 15:52:44 回复(0)
Const. 引用 在初始化列表中初始化。 Static在类外初始化。 普通变量可以在初始化列表也可以在构造函数里面赋值
发表于 2016-08-13 11:14:41 回复(0)

感觉就2种情况,第3条就是根据1.和2.推导的吧
1.非静态 const 成员。
2.引用成员。

3.没有默认构造的类对象(其实就是包含1.和2.的类)。

我不理解,第三种难道不也是推导出来的吗,
A::a是一个引用,因此必须通过在初始化列表中初始化,所以说A需要自己编写构造函数,使用系统默认的构造函数是不可以的。
A一旦编写了构造函数,系统就不会提供默认的构造函数了,所以B类中的c是一个A类子对象,它就没有默认构造了,所以必须在初始化列表显式调用构造函数。

编辑于 2023-12-13 23:06:40 回复(0)
static 修饰的变量在类外初始化,const修饰的在参数列表初始化
在构造函数中需要初始化列表的有如下三种情况:
1.带有const修饰的类成员,如 const int a
2.引用成员数据,如int &p
3.带有引用的类变量
发表于 2021-03-08 10:20:11 回复(0)
答案有问题。 假如 int n =1; A的构造函数用n初始化a,这时候c可以不用放初始化列表
发表于 2021-03-02 22:29:32 回复(0)
类的构造函数在执行前会对自动对基类和成员变量采用无参数构造函数进行初始化,但是,如果没有无参数构造函数的基类或者成员变量,则需要手动使用参数化列表调用对应的构造函数。
发表于 2020-07-26 13:30:22 回复(0)
b为const变量,需要列表初始化, c为带有引用的类变量,列表初始化 d为static在类为初始化
发表于 2019-04-06 11:05:32 回复(0)
引用,常量,以及没有默认构造函数的类的类型,都需要初始化成员列表
发表于 2018-07-19 16:00:06 回复(0)
常量和引用成员要通过初始化列表初始化;
c之所以要放在初始化列表中,并不是因为c中含有引用成员,根本原因是没有合适的默认构造函数;如下例子“A c”并没有出现在B的初始化列表里,因为类A的引用成员“int& a”在类A的默认构造函数里正确初始化了
class A {
public:
     A();
private:
     int& a;
     int b;
};
A::A() :a(b)
{
}
class B:public A{
public:
     B();
private:
     int a;
public:
     const int b;
     A c;
     static const char* d;
     A* e;
};
B::B() :b(0)
{
}
编辑于 2019-06-10 20:39:56 回复(0)