首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++初始化列表与赋值

C++初始化列表与赋值
EN

Stack Overflow用户
提问于 2020-05-11 11:17:20
回答 2查看 190关注 0票数 2

在C++中,初始化列表和在构造函数中赋值有什么区别,而不是每个方法的外观?我的意思是,使用其中一个而不是另一个有什么好处,为什么在幻灯片中的给定示例中(如下所示)只适用于初始化?(我希望你能添加一些资源,因为我没有找到)

Click here to view slide: uploaded on imgur

EN

回答 2

Stack Overflow用户

发布于 2020-05-11 11:43:17

在构造函数中使用初始化列表是一个简单的过程,即在声明对象时初始化对象。它调用复制构造函数。

因此,昂贵的操作。

在C++中,类的常量或引用数据成员变量只能在初始化列表中初始化,不能使用构造函数体中的赋值。

常量和引用数据成员变量都具有必须在声明时初始化的属性。因此,只有在构造函数中使用初始化列表,因为初始化列表在声明时初始化类成员变量,而如果构造函数主体在声明后初始化数据成员,则赋值。

在某些情况下,构造函数中的数据成员初始化不起作用,必须使用初始化器列表。以下是这样的情况。

用于初始化非静态常量数据成员的

#包含使用命名空间标准;类测试{ const int t;public: Test(int t):t(t) {} //必须在getT() {t1 t;}}中使用初始化列表;int main() { Test t1(10);cout<

#include using namespace std;class Test { int &t;public: Test(int &t):t(t) {} //必须在getT() {t1 t;} };int main() { int x= 20;Test t1(x);cout<

用于初始化没有默认构造函数的成员对象的

  1. 。(在您的情况下,阵列数字没有默认constructor)

#包含使用命名空间标准;类A{ int i;public: A(int );};A::A(int arg) {i= arg;cout <<“A的构造函数调用: Value of i:”<< I << endl;} // B类包含A类B的对象{A a;public: B(int );};B::B(int x):a(x) {//必须使用初始化列表cout <<“B的构造函数已调用”;} int main() {B obj(10);return 0;}

用于初始化基类members.

  • When构造函数的参数名称的
  1. 与数据成员相同。出于性能原因,请使用
票数 4
EN

Stack Overflow用户

发布于 2020-05-11 11:36:45

如果不使用初始化列表,则类的数据成员将在到达构造函数正文之前默认构造:

代码语言:javascript
复制
class Foo{
    private:
        int bar;

    public:
        Foo(int _bar){//bar is default constructed here
            bar = _bar; //bar is assigned a new value here
        }
};

对于像int这样的基础类型来说,这不是一个大问题,因为默认构造函数并不昂贵。但是,如果数据成员没有默认构造函数,或者默认构造后进行赋值比直接构造开销更大,则可能会出现问题:

代码语言:javascript
复制
//Bar does not have a default constructor, only a copy constructor
class Bar{
    public:
        Bar() = delete; //no default constructor
        Bar(const Bar& bar); //copy constructor only
};

class Foo{
    private:
        Bar bar;

    public:
        Foo(const Bar& _bar){
            //this will not compile, bar does not have a default constructor
            //  or a copy assignment operator
            bar = _bar;
        }

        Foo(const Bar& _bar) : bar(_bar){//this will compile, copy constructor for bar called
        }
};

一般来说,使用初始化列表可以获得更高效的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61721746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档