C++默认初始化和值初始化、 直接初始化和拷贝初始化

默认初始化和值初始化一一对应

前提知识
声明: 在环境/上下文中指定一个变量的名字。也就是说,声明仅仅是让编译器知道,而没有实际分配空间。

初始化:给一个声明后尚未初始化的变量一个有意义的初始值。

赋值 : 销毁一个变量原来的值,并赋予一个新值。相当于改变了一个变量的状态。

默认初始化:

对象可能产生未定义的值(是否绝对尚待确定,例如类类型(定义了默认构造函数)的默认初始化是否属于值初始化等)。

值初始化:

对象的值是确定(预设)的。

值初始化出现场景:

1.数组初始化时初始值数量小于维度,剩下的元素会进行值初始化;

1
{ int array[10] = {1, 2, 3}; }

2.当我们不使用初始值定义一个静态变量;

1
2
3
//未经初始化的全局静态变量和局部静态变量都会被自动初始化为0
static int n1; //n1值初始化为0
{ static int n2; } //n2值初始化为0

3.形如T()的表达式显示地请求值初始化;

1
2
3
4
{
std::string *pia1 = new int[10](); //动态分配10个值初始化为0的int
std::string *pia2 = new int[10]; //动态分配10个未初始化的int
}

4.只提供vector对象容纳的元素数量而略去初始值,此时库会创建一个值初始化的元素初值(c++ primer p88)

1
vector<int> ivec(10); //10个元素都被初始化为0

默认初始化出现场景:

1.块作用域内不使用任何初始值定义一个非静态变量;

1
{ int a; }//a的值是未定义的,但若在任何函数之外,会被初始化为0

2.类通过默认构造函数来控制默认初始化过程,默认构造函数以如下规则初始化类的数据成员

  • 如果存在类内初始值,用它来初始化成员
  • 否则,默认初始化该成员

直接初始化和拷贝初始化一一对应

直接初始化:

直接调用与实参匹配的构造函数,形式如“T t(u)”。

拷贝初始化:

拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象复制到正在创建的对象”,形式如“T t=u”。