变量的几种初始化方式

注:该整理并不全面或准确,仅供参考,欢迎评论交流。本文部份内容来自 C++primer 中文版第五版 原文。数组

变量初始化有几种:函数

默认初始化:内置类型定义于函数体内其值未定义,定义于函数体外被初始化为0;类类型由默认构造函数初始化code

值初始化:内置类型初始化为0;类类型由默认构造函数初始化对象

显示初始化(直接初始化和拷贝初始化):内置类型根据给定参数初始化;类类型由特定的构造函数初始化。class

因此,类对象经过构造函数初始化,若是缺乏某种构造函数,则不能进行某种初始化。变量

----------------------------------------------------------------------------------------------------------------------构造函数

变量(不管内置类型或类类型、单个或数组)若是不显示初始化,则采用默认初始化;局部静态变量则采用值初始化。im

int val; int val[10];
void func(){ int val2;     static int val3;  } 
void func(){ int val2[10]; static int val3[10]; } 
// val(不管单个对象获数组,默认初始化)值为0, val2(...默认初始化)值未定义! val3(...值初始化)值为0 
// 类类型的默认初始化和值初始化都是经过默认构造函数。

动态分配的变量(不管内置类型或类类型、单个或数组)默认状况下采用默认初始化,在类型后加单个括号以采用值初始化。数据

void func()  
{ 
    int *pobj = new int;    int *parr = new int[10];  
    int *pobj2 = new int(); int *parr2 = new int[10]();
}
// pobj 指向的对象值未定义! parr 指向的数组的元素值未定义!
// pobj2 指向的对象值为0。  parr2 指向的数组的元素值都为0

新标准的初始化列表可对单个或数组对象(不管是否动态分配)进行列表初始化。若为单个对象,则初始化列表只能包含0个或1个初始值;若为数组,则列表中初始值数量不超过数组维度,若是维度比提供的初始值数量大,则用提供的初始值初始化靠前的元素,剩下的元素被值初始化。static

int val {1};            int arr[10] = {1,2,3}; 
int *val = new val{1};  int *arr = new arr[10]{1,2,3}; 
 // val = 1; arr = 1,2,3,0,0,0,0,0,0,0

 ------------------------------------------------------------------------------------------------------------------

类对象经过构造函数进行初始化的。构造函数容许有一个初始值列表。对于类的数据成员,若是没有在构造函数的初始值列表中显示地初始化成员,则该成员将在构造函数体以前执行默认初始化(若是存在类内初始值,用它来初始化成员,不然默认初始化)。随着构造函数体一开始执行,初始化就完成了。

相关文章
相关标签/搜索