初始化
在定义变量时我们可以对其进行初始化。C++中使用的初始化方式有以下几种类型:
int i = 0;
int i(0);
int i = {0};
int i{0};
其中使用花括号的初始化方法为被称作列表初始化,是C++ 11后支持的特性。在此之前,花括号仅在初始化数组等有限场景下有效。与正常初始化不同,使用列表初始化时,若存在精度损失,则会编译出错。例如:
int i = { 114.514 }; // 编译出错
// error: type 'double' cannot be
// narrowed to 'int' in initializer list.
默认初始化
如果我们在定义变量时没有对其进行初始化,则该变量将会进行执行默认初始化操作。该操作遵循以下原则:
- 任何函数体外的基本类型变量会自动初始化为0。
- 任何函数体内的基本类型变量,其值未定义。读写该变量可能会引发错误
(实际测试未发现这种情况,原因待定)
。 - 未显示初始化的类对象,其值由其构造函数决定,C++中很多类均支持默认初始化,例如string初始化为空串
""
,vector初始化为空容器等。
初始化与赋值的区别
初始化与赋值在C++中概念不同。初始化是在创建变量内存空间时给予该空间初始值,而赋值则是将该内存空间的数据擦除,再赋新值。
声明与定义的区别
声明用于让程序知晓一个变量的存在,而本身不会分配内存空间。而定义的目的在于创建一个变量,是要分配空间的。在C++中,我们在使用另一个文件定义的变量前,必须先在本文件中使用extern
关键字对其进行声明。
int i; // 定义
extern int j; // 声明
此外,任何包含显式初始化的声明均视作定义。这也就是说,我们可以对extern
关键字声明的变量赋初始值,这会抵消掉extern
的作用,使该语句变为定义语句。
extern int k = 0; // 定义