构造函数和初始化列表

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数和初始化列表相关的知识,希望对你有一定的参考价值。

区别:

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

技术图片

 

以上是关于构造函数和初始化列表的主要内容,如果未能解决你的问题,请参考以下文章

将初始数据提供给片段的正确方法?

重构构造函数以使用初始化列表

如何使用大小和值构造函数使用成员初始化器列表初始化用户定义对象的向量

C++:初始化成员变量(无参构造|有参构造|初始化列表)

为啥 C++ 列表初始化也会考虑常规构造函数?

在 Visual Studio 中创建构造函数的代码片段或快捷方式