初学者在刚开始读 C++ Primer 的时候,总是容易被书中各种初始化搞得头大:默认初始化、列表初始化、值初始化、类内初始值、构造函数初始值列表、new int
和 new int()
的区别...
本文把书中这些概念集中总结如下,大括号【】内为原书中文版第 5 版的相应页码。
列表初始化(list initialization)【P39】:用花括号 {}
来初始化变量,在 C++11 中得到全面应用
// 以下 4 种初始化的形式都可以
int i = 0;
int i = {0};
int i{0};
int i(0);
long double ld = 3.1415;
int a{ld}; // 报错,转换存在信息丢失的风险
int b = {ld}; // 报错,转换存在信息丢失的风险
int c(ld); // 正确,但信息丢失
int d = ld; // 正确,但信息丢失
如果列表初始化存在信息丢失的风险, 编译器将报错。
默认初始化【P40】:如果定义变量时没有指定初始值,则变量被默认初始化
值初始化(value initialization)【P88、P118】
new int()
, new string()
【P408】类的对象无论在函数内/外,全局/局部,静态/非静态,其初始化都是由类负责
类内初始值(in-class initializer)【P65】
C++11 新标准,在类的定义中直接指定初值,可以用等号或者花括号,但是不能用圆括号。
class SalesData {
std::string bookNo;
unsigned unitsSold = 0;
double revenue {0.0};
};
【P238】推荐使用类内初始值!
构造函数初始值列表【P238】:用构造函数的参数初始化成员变量。
class SalesData {
public:
SalesData(const std::string &s) : bookNo(s) {}
SalesData(const std::string &s, unsigned n, double p) : bookNo(s), unitsSold(n), revenue(p*n) {}
};
new【P408】
string *ps1 = new string; // 默认初始化为空 string
string *ps2 = new string(); // 值初始化为空 string
int *pi1 = new int; // 默认初始化,*pi1 值未定义!
int *pi2 = new int(); // 值初始化,*pi2 为 0
const int *pci - new const int(1024); // 分配并初始化一个 const int
原文地址:https://www.cnblogs.com/tengzijian/p/15376463.html
转载自: https://www.cnblogs.com/tengzijian/p/15376463.html