【C++ Primer 学习札记】初始化和赋值

参考博客:【初始化(C++primer5th学习笔记)】https://blog.csdn.net/blubluhao/article/details/53436387

《C++ Primer》P39

初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。

 1、默认初始化

(1)对于内置类型(int),定义在任何函数之外的变量被初始化为0,而定义在函数体内部则是未定义,不能对其进行访问。通过new生成的int类型对象也是未定义。
(2)对于类类型(string),由其默认构造函数初始化。


2、直接初始化和拷贝初始化

拷贝初始化:使用等号初始化变量执行的是拷贝初始化,把等号右侧的初始值拷贝到新创建的对象中,int i=0;
直接初始化:如果不使用等号则执行的是直接初始化。


3、值初始化

如果只提供容器容纳数量而略去初始值,会创建一个值初始化的元素初值。

vector i(10);          //10个元素,每个都初始化为0  
vector s(10);       //10个元素,每个都是空string对象  

列表初始值还是元素数量?
一般用圆括号表示的是元素的数量,提供的值是用来构造对象的。
用花括号表示的是尽量当成元素初始值的列表,表示列表初始化对象。

vector v1(10);         //10个元素,每个都初始化为0
vector v2{10};         //1个元素,值为10
vector v3(10,1);       //10个元素,每个都是1
vector v4{10,1};       //两个元素,值分别是10和1

4、列表初始化

使用列表初始化在存在丢失信息的风险时,编译器会报错。即需要进行类型转换的时候不能使用列表初始化。
注意事项:
对于定义了自己的构造函数的类类型,要求值初始化是没有意义的。但对于内置类型,值初始化的内置类型对象有着良好的定义的值,而默认初始化的对象的值是未定义的。

int *p1=new int;        //未定义
int *p2=new int();      //值初始化为0


 

你可能感兴趣的:(《C++,Primer》学习札记)