码迷,mamicode.com
首页 > 其他好文 > 详细

构造函数和初始化列表

时间:2019-03-09 23:28:16      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:列表   对象   接下来   个数   include   成员   alt   out   初始化   

区别:

  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;
};

技术图片

 

构造函数和初始化列表

标签:列表   对象   接下来   个数   include   成员   alt   out   初始化   

原文地址:https://www.cnblogs.com/tianzeng/p/10503387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!