C++四种初始化方式

1. 直接初始化直接调用与实参匹配的构造函数,形式如“T t(u)”。
2. 拷贝初始化:复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象”,形式如“T t=u”。


直接初始化不一定要调用复制构造函数
复制初始化(拷贝初始化)一定要调用复制构造函数


注意:一般而言,在变量初始化时,尽量采用直接初始化形式,而不是拷贝初始化。

 

 

1.默认初始化
如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”。
 1 int i; 2 A a; 

2.直接初始化
如果不使用等号,则执行的是直接初始化。

1 int a(0);
2 string str1(“hello”);
3 string str2(10, ‘c’);//这种情况拷贝初始化不能完成
4 A a(pa);

 

3.拷贝初始化
如果使用一个等号初始化一个变量,实际上执行的是拷贝初始化。编译器会把等号右侧的初始值拷贝到新创建的对象中去。

1 int a = 0;
2 int a = {0};
3 string str1 = “hello”;
4 A pa; A a = pa;

 

4.值初始化

显式使用T()或T{},T为类型,括号里为空,称为值初始化

或者容器如vector,vector<int> p(10);其中int类型有默认构造函数,此时库会创建一个值初始化(value-initialized)的元素初值,并赋给容器中所有元素。

目前我个人的理解是:其中int是值初始化了(初始化为0),用这个0赋给p的所有10个元素。vector应该不能算值初始化,而是直接初始化。

1 vector <int>v1(10);//v1有10个元素,每个的值都是0,
2 vector <int>v2{10};//v2有1个元素,该元素的值是10
3 vector <int>v3(10, 1);//v3有10个元素,每个的值都是1
4 vector <int>v4{10, 1);//v4有2个元素,值分别是10和1

 

 

1 string *ps1 = new string;     //默认初始化为空string
2 string *ps2 = new string();   //值初始化为空string
3 int *pi1 = new int;           //默认初始化;*pi1的值未定义
4 int *pi2 = new int();         //值初始化为0;*pi2为0

C++ PRIMER:

值初始化:

(1)在数组初始化的过程中,如果提供的初始值数量少于数组的大小,剩下的元素会进行值初始化;

(2)当我们不使用初始值定义一个局部静态变量时;

(3)当我们通过书写形如T()的表达式显示地请求值初始化时;

默认初始化:

(1)当我们在块作用域内不使用任何初始值定义一个非静态变量时,

(2)当一个类本身含有类类型成员且使用合成的默认构造函数时;

(3)当类类型的成员没有在构造函数初始值列表中显式地初始化时;

posted @ 2020-01-27 01:27  NeoZy  阅读(5175)  评论(0编辑  收藏  举报