C++中各种初始化方式示例详解

2020-01-06 17:24:18丽君

4. 列表初始化是C++新标准给出的一种初始化方式,可用于内置类型,也可以用于自定义对象,前者比如数组,后者比如vector。典型的:


int array[5]={1,2,3,4,5};
vector<int> v={1,2,3,4,5};

文章写到这里,读者认真的看到这里,似乎已经懂了C++的各种初始化规则和方式,下面用几个例子来检测一下:


#include <iostream>

using namespace std;

class Init1
{
public:
 int i;

};

class Init2
{
public:
 Init2() = default;

 int i;

};

class Init3
{
public:
 Init3();
 int i;

};

Init3::Init3() = default;

class Init4
{
public:
 Init4();

 int i;

};

Init4::Init4()
{
 //constructor
}

class Init5
{
public:
 Init5(): i{}
 {

 }
 int i;

};


int main(int argc, char const *argv[])
{
 Init1 ia1;
 Init1 ia2{};
 cout << "Init1: " << " "
   << "i1.i: " << ia1.i << "t"
   << "i2.i: " << ia2.i << "n";

 Init2 ib1;
 Init2 ib2{};
 cout << "Init2: " << " "
   << "i1.i: " << ib1.i << "t"
   << "i2.i: " << ib2.i << "n";

 Init3 ic1;
 Init3 ic2{};
 cout << "Init3: " << " "
   << "i1.i: " << ic1.i << "t"
   << "i2.i: " << ic2.i << "n";

 Init4 id1;
 Init4 id2{};
 cout << "Init4: " << " "
   << "i1.i: " << id1.i << "t"
   << "i2.i: " << id2.i << "n";

 Init5 ie1;
 Init5 ie2{};
 cout << "Init5: " << " "
   << "i1.i: " << ie1.i << "t"
   << "i2.i: " << ie2.i << "n";

 return 0;
}

试问上面代码中,main程序中的各个输出值是多少?先不忙使用编译器编译程序,根据之前介绍的知识先推断一番:

首先,我们需要明白,对于类来说,构造函数是用来负责类对象的初始化的,一个类对象无论如何一定会被初始化。也就是说,当实例化类对象时,一定会调用构造函数,不论构造函数是否真的初始化了数据成员。故而对于没有定义任何构造函数的自定义类来说,该类的默认构造函数不存在“被需要/不被需要”这回事,它必然会被合成。

对于Init1,由于我们对其没有做任何构造函数的声明和定义,因此会合成默认构造函数。 对于Init2,我们在类内部声明处要求合成默认构造函数,因此也会有合成的默认构造函数。

由于Init1和Init2它们拥有类似的合成默认构造函数,因此它们的ia1.i和ib1.i值相同,应该都是随机值,而ia2.i和ib2.i被要求值初始化,因此它们的值都是0。