c++ 中在构造函数中赋值和使用初始化列表有什么区别?

C++ 中在构造函数中赋值和使用初始化列表有两个主要的区别:

效率:初始化列表是在对象创建时直接初始化成员变量,而构造函数中的赋值是在对象创建后对已经初始化的成员变量进行赋值。初始化列表可以避免产生临时对象和多余的拷贝操作,提高效率。
适用范围:初始化列表可以用来初始化 const 成员、引用成员、没有默认构造函数的类类型成员,而构造函数中的赋值不能对这些成员进行赋值。

因此,建议优先使用初始化列表来初始化类的成员变量,除非有特殊的需求。

C++ 类构造函数初始化列表 | 菜鸟教程 (runoob.com)

在C++中,在构造函数中赋值和使用初始化列表的区别在于:

1. 构造函数中赋值:在构造函数的函数体内部进行成员变量的赋值操作。这种方式在构造函数执行时才会进行成员变量的赋值操作。

class MyClass {
public:
    MyClass(int a) {
        this->a = a;
    }
private:
    int a;
};

2. 使用初始化列表:在构造函数的参数列表后面使用冒号初始化成员变量。这种方式在对象创建时就会进行成员变量的初始化操作。

class MyClass {
public:
    MyClass(int a) : a(a) {
    }
private:
    int a;
};

使用初始化列表的方式更加高效,因为它可以在对象创建时就进行成员变量的初始化,避免了先构造对象再进行赋值操作的额外开销。因此,建议在构造函数中进行成员变量的初始化时尽量使用初始化列表的方式。

当使用初始化列表时成员变量的初始化顺序与它们在类中声明的顺序一致,而不是与它们在初始化列表中的顺序一致。这意味着在初始化列表中的顺序并不影响成员变量的初始化顺序。

另外,对于某些特定的情况,例如成员变量是const、引用类型或者类类型时,必须使用初始化列表来进行初始化,因为这些类型的成员变量只能在初始化时进行赋值,而不能在构造函数体内进行赋值。

总的来说,虽然在构造函数中赋值和使用初始化列表都可以进行成员变量的初始化,但使用初始化列表的方式更加高效和灵活,而且对于某些特定类型的成员变量来说是必须的。因此,建议尽量使用初始化列表来进行成员变量的初始化。

必须使用初始化列表的场景

根据上面的分析,我们就不难理解为什么说一些特定场景下必须要使用初始化列表了,总结起来就是:

    如果类的成员是const、引用、或者是未提供默认构造函数的类,我们就必须通过构造函数初始化列表为这些成员提供初值

详细说明如下:

(1)需要初始化的数据成员是对象的情况(包含继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);

数据成员是对象,并且这个对象只有含参数的构造函数,没有无参数的构造函数。如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认的构造函数,这时要对其进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,就无法完成。

(2)需要初始化const修饰的类成员或初始化引用数据成员;

     当类成员中含有一个const对象时,或者一个引用时,必须经过成员初始化列表进行初始化,因为const对象或者引用在声明的同时必须初始化,而在构造函数中,做的是对它们的赋值,并不是初始化。

(3)子类初始化父类的私有成员

     子类初始化父类的私有成员,需要在(并且只能在)参数初始化列表中显示调用父类的构造函数。
                       
参考链接:https://blog.csdn.net/wads23456/article/details/105022011

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值