首页 > 试题广场 >

有哪几种情况只能用intialization list 而不

[不定项选择题]
有哪几种情况只能用intialization list 而不能用assignment?
  • 当类中含有const成员变量
  • 基类无默认构造函数时,有参的构造函数都需要初始化。
  • 当类中含有reference成员变量
  • 当类中含有static成员变量
推荐
ABC
因为const对象以及引用只能初始化而不能赋值,所以只能使用成员初始化列表。
对于非内置类型,在进入函数体之前,如果没有提供显式初始化,会调用默认构造函数进行初始化。若没有默认构造函数,则编译器尝试调用默认构造函数将会失败,所以如果没有默认构造函数,则必须在初始化列表中显示的调用构造函数。
static 成员在执行构造函数前就已经构造好了,即使不存在类对象,也可以被使用,不需要初始化列表
编辑于 2015-12-13 13:22:58 回复(6)
ABC
1、const 常变量、引用,只能初始化,不能修改赋值,都必须在初始化列表中初始化
2、若父类中没有默认构造方法,那么,在子类中的初始化列表中必须显式的调用基类的有参数构造,否则会编译不通过
发表于 2018-04-25 19:37:45 回复(0)
下面内容摘自《C++高级编程》
C++提供另一种方法,以便在构造函数中初始化数据成员,这称为初始化列表(initializer list)。
这里使用了初始化列表语法:
SpreadsheetCell :: SpreadsheetCell ( ) : mValue( 0 ) ,mString ( " " )
{
}

初始化列表允许在创建数据成员的同时为之提供初始值,这比以后再赋值效率更高。
有些程序员更喜欢在构造函数体中赋初值的做法,这是一种更常用的做法。
不过,有一些数据类型必须在初始化列表中进行初始化。如下:
数据类型 解释
const 数据成员 创建一个const变量后再对其赋值是不合法的。必须在创建的时候提供值
引用数据成员 如果不引用具体的东西,引用无法独立存在
没有默认构造函数的对象数据成员 C++会使用默认构造函数来初始化成员对象。如果成员对象没有默认构造函数,就无法初始化
没有默认构造函数的超类


发表于 2018-03-09 14:01:04 回复(1)
1. const常量、引用,只能初始化,不能修改赋值,所以必须在初始化列表中初始化
2. 如果父类中没有默认构造方法,那么,在子类中的初始化列表中必须显式的调用基类的有参数构造,否则会编译不通过
发表于 2016-06-15 09:07:58 回复(0)
关于B选项:
class testA
{
private:
    int val;
public:
    //testA(int x):val(x){}//编译通过
    testA(int x){val = x;}//编译通过
    testA()=delete;
};

class testAA : public testA
{
private:
    int val2;
public:
    //testAA(int x):val2(x){}//编译不通过
    testAA(int x):val2(x),testA(x){}//编译通过
    testAA(int x, int y) : testA(y){val2 = x;}//编译通过
    //testAA(int x, int y) : val2(x), testA(y){}//编译通过
    testAA()=delete;
};
对于基类中没有默认构造函数的情况,我们在子类中所有有参的构造函数都必须调用基类的有参构造函数才可以编译通过.但是在无论在基类还是子类中都未必使用参数初始化表.

编辑于 2016-05-30 14:27:42 回复(0)
静态成员变量在执行构造函数之前,即已经存在了,即使不存在类对象,它也可以被使用。所以它不用初始化列表。
发表于 2015-09-08 10:56:55 回复(0)
reference成员是引用成员的意思,
引用数据成员 如果不引用具体的东西,引用无法独立存在
发表于 2018-03-11 16:22:00 回复(0)
为什么调用基类的构造函数只能写在初始化列表中? 为了确保调用派生类的构造函数的时候,已经调用过基类的某个构造函数,完成了派生类的继承自基类部分的数据成员的初始化。即确保调用顺序是:先调用基类的构造函数,再调用派生类的。 因为,调用派生类的构造函数时,可能会调用继承自基类的函数。因此,调用派生类的构造函数时,必须确保继承自基类的部分已构造完毕,而将基类构造函数的调用写在初始化列表中,能更好地做到这一点。 另外,如果基类不存在默认构造函数,则派生类在进行构造函数的时候,必须将基类的构造函数写在初始化列表中的,否则编译不会通过。也就是说,在派生类进入构造函数之中以后,基类的构造函数默认已经是完成的了。 在c++中,const成员和引用成员必须在初始化列表中初始化,而不能在构造函数体内初始化。 为什么? 因为在进入构造函数体内时,引用变量和const变量都已经用不确定的值初始化好了,构造函数内能做的只有赋值,而const类型和引用类型是不可以赋值的。所以,需要在初始化列表中初始化。
编辑于 2021-09-28 22:41:50 回复(0)
  • 为了使程序能够顺利地被编译,必须使用member initialization list的4种情况:
    • 当初始化一个reference member时;
    • 当初始化一个const member时;
    • 当调用一个base class的constructor,而它拥有一组参数时;
    • 当调用一个member class的constructor,而它拥有一组参数时;
                                                                            ——《深度探索C++对象模型》
发表于 2019-07-15 10:13:50 回复(0)
这是什么情况呢,没有通过初始化列表,都可以初始化呀??
#include<iostream>
using namespace std;
class A
{
public:
static int l;
const int a = 1;
  int c = 2;
  const int &a1 = a;
  int &b = c;
  A();
private:
int o = 8;
};
 int A::l = 9;
int main()
{
A a;
cout << a.l << endl;
cout << a.a << endl;
cout << a.a1 << endl;
cout << a.c << endl;
cout << a.b << endl;
system("pause");
return 0;
}
A::A()
{
}
发表于 2016-08-27 21:37:05 回复(0)
整上洋文还以为是什么没学过的东西
发表于 2023-10-06 22:03:46 回复(0)
答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。
发表于 2014-10-25 00:26:12 回复(0)
拽牛魔洋文呢,还以为reference是什么玩意原来是引用啊😅😅😅
编辑于 2023-12-28 10:02:56 回复(0)
intialization list 初始化列表
assignment  赋值    不等于初始化,初始化是在定义的时侯给变量初始化。赋值是定义后使用等号给其赋值。
引用和const变量使用的时候必须初始化。只能初始化,不能赋值。
当有对象成员的时候,默认调用无参构造,若想使用有参构造必须使用初始化列表。
发表于 2023-10-25 21:32:46 回复(0)
为什么出个题好好的一个初始化列表你非要搞个initialization list 啊,你说const,static英文就算了,非得夹着来是吧
发表于 2023-09-08 09:28:01 回复(0)
        对于A、C选项,必须知道初始化列表中的发生行为在相应的构造函数被调用之前。且初始化列表中才是真正的初始化,即一步调用拷贝构造函数分配内存之后立刻赋值,这一点符合const变量和引用定义时必须有初值的特点。但在构造函数内部的“初始化”是先调用变量的默认构造函数分配内存再调用拷贝赋值运算符赋值,因为分配内存和赋值分成了两步走,所以在第一步时对于一定要求定义时有初值的const成员变量和引用来说都会报错,当然也就走不到第二步了。
        对于D选项,static变量它属于类而不属于对象,不依赖对象而存在,自然它不需要麻烦 用于创建对象的构造函数去初始化。
        对于B选项,如果你需要调用基类的构造函数去初始化基类中的成员时,当然要把基类的构造函数放在初始化列表,因为构造对象时会先调用基类的构造函数后调用子类的构造函数,如果你将基类构造函数的调用放在子类构造函数内部当然要报错了。
编辑于 2021-11-01 04:46:18 回复(0)
refrence是应用。。。
发表于 2021-03-04 08:14:55 回复(0)

1.引用一定要初始化

2.static变量在构造函数之前就要初始化

发表于 2019-03-01 12:16:54 回复(0)
const 常量,引用只能初始化,不能修改赋值,所以必须在初始化列表中初始化;
发表于 2018-09-04 22:22:15 回复(0)
标记
发表于 2018-03-12 23:38:20 回复(0)
借用:子类中没有调用基类构造函数,则会去基类中找无参的构造函数,如果基类中又无无参的构造函数,则出错。 class testA { private:     int val; public:     //testA(int x):val(x){}//编译通过     testA(int x){val = x;}//编译通过     testA()=delete; }; class testAA : public testA { private:     int val2; public:     //testAA(int x):val2(x){}//编译不通过     testAA(int x):val2(x),testA(x){}//编译通过     testAA(int x, int y) : testA(y){val2 = x;}//编译通过     //testAA(int x, int y) : val2(x), testA(y){}//编译通过     testAA()=delete; };
发表于 2017-10-10 00:43:18 回复(0)