构造函数和初始化列表

区别:

  1. 对于在函数体中(构造函数)初始化,是在所有的数据成员被分配内存空间后才进行的。
  2. 列表初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。 

  在我们使用初始化列表进行初始化时,它是关于C++初始化类成员的。它们是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

三种类型必须通过初始化列表来初始化 

  1. 常量 
  2. 引用类型 
  3. 没有默认构造函数的类类型

  初始化列表和构造函数初始化(赋值)的方式对于内置类型的成员(如int等)来说,其实没有什么区别,其性能和结果往往一样。对于非内置类型的成员(类类型)来说,是有区别的。

  因为编译器总是确保所有成员对象在构造函数体执行之前初始化,所以类类型的数据成员对象,在进入构造函数体之前已经完成构造。例子中编译的代码将调用base::base()来初始化b(这里调用一次base构造函数),这在控制到达赋值语句前完成。接下来有调用一个赋值运算符函数。结果是调用了两个base函数(构造函数和赋值操作符)。

#include <iostream>
using namespace std;

class base
{
    public:
        base()    
        {
            cout<<" empty construct"<<endl;
        }
        base(const base &b)
        {
            cout<<" copy construct"<<endl;
        }
        base& operator=(base &b)
        {
            if(&b!=this)
                cout<<" operator = construct"<<endl;
            return *this;
        }
};
class my_base
{
    public:
        my_base(base &b)
        {
            ba=b;
            cout<<" my_base construct"<<endl;
        }
        base ba;
};
int main()
{
    base b;
    my_base    mb(b);
    return 0;
}

  把my_base类改成初始化列表形式

class my_base
{
    public:
        my_base(base &b):ba(b)
        {
            cout<<" my_base construct"<<endl;
        }
        base ba;
};

 

转载于:https://www.cnblogs.com/tianzeng/p/10503387.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值