文章目录
1 默认初始化 Default initialized
- 内置类型变量
- 在函数(包括
main
函数)内部定义,则不初始化 - 在函数外部定义,则初始化为0
- 在函数(包括
- 类类型变量:因类各异
string
对象被初始化为空字符串vector
对象被初始化为空vector
示例
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int i1; // 0
double d1; // 0.
char c1; // '\0'
string s1; // ""
vector<int> v1; // 空vector
int main()
{
int i2; // 未定义
double d2; // 未定义
char c2; // 未定义
string s2; // ""
vector<int> v2; // 空vector
return 0;
}
2 列表初始化 List initialized
列表初始化使用花括号{}
来初始化变量
列表初始化示例
int i{1}; // i被初始化为1
double j = {3.14}; // j被初始化为3.14
vector<char> cvec{'a','b'}; // cvec被初始化为{'a','b'}
N.B.
如果使用列表初始化且初始值存在丢失信息的风险,则编译器将报错
long double ld = 3.1415926536;
int a{ld}; // 错误:转换未执行,因为存在丢失信息的风险
int b = {ld}; // 错误:转换未执行,因为存在丢失信息的风险
int c(ld); // 正确:转换执行,且确实丢失了部分值
int d = ld; // 正确:转换执行,且确实丢失了部分值
3 圆括号初始化
圆括号初始化使用()
来初始化变量
常见示例
double d(1.3); // d被初始化为1.3
string s1(5,'c'); // s1被初始化为"ccccc"
N.B.
类内初始值不能用圆括号初始化,只能用拷贝初始化或列表初始化
struct foo
{
int a(1); // 错误,不能用圆括号初始化
int a{1}; // 正确,可以用列表初始化
char c = 'f'; // 正确,可以用拷贝初始化
}
4 拷贝初始化 Copy initialization 与 直接初始化 Direct initialization
使用赋值运算符=
就是拷贝初始化,否则就是直接初始化
示例
string s5 = "hello"; // 拷贝初始化
double d{10.1}; // 直接初始化也是列表初始化
vector<int> vint(4,9); // 直接初始化,vint被初始化为{9,9,9,9}
如果要用多个值进行初始化,推荐使用直接初始化
string s1(5,'c'); // 推荐直接初始化:s1被初始化为"ccccc"
string s2 = string(5, 'c'); // 不推荐拷贝初始化,可读性差
5 值初始化 Value-initialized
- 内置类型被初始化为0
- 类类型由类的默认构造函数初始化(如
string
初始化为空串)
vector
对象的值初始化
vector<int> vint1(5) = {1,2,3}; // vint1被初始化为{1,2,3,0,0}
vector<double> vdb1(4); // vdb1被初始化为{0.,0.,0.,0.}
vector<string> vs1(3); // vs1被初始化为{"","",""}
数组对象的值初始化
int a1[5]{1,2,3}; // a1被初始化为{1,2,3,0,0}
int a2[5] = {}; // a2被初始化为{0,0,0,0,0}
局部静态变量的值初始化
int fun()
{
static int var; // var被初始化为0
return var;
}
聚合类的值初始化
struct Data
{
string s;
int ival;
};
Data data1 = {"hello"}; // data1.ival被初始化为0
Reference
C++ Primer