列表初始化
当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:
long double ld=3.1415926536;
int a{ld},b={ld}; //错误:转换未执行,因为存在丢失信息的危险
int c(ld),d= ld; //正确:转换执行,且确实丢失了部分值
使用 long double 的值初始化 int 变量时可能丢失数据,所以编译器拒绝了a和b的初始化请求。其中,至少 ld 的小数部分会丢失掉,而且 int 也可能存不下 ld 的整数部分。
默认初始化
如果是内置类型的变量未被显式初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为 0。然而如 6.1.1节(第185 页)所示,一种例外情况是,定义在函数体内部的内置类型变量将不被初始化(uninitialized)。一个未被初始化的内置类型变量的值是未定义的(参见 2.1.2节,第 33 页),如果试图拷贝或以其他形式访问此类值将引发错误。
每个类各自决定其初始化对象的方式。而且,是否允许不经初始化就定义对象也由类自己决定。如果类允许这种行为,它将决定对象的初始值到底是什么。绝大多数类都支持无须显式初始化而定义对象,这样的类提供了一个合适的默认值。
例如,以刚刚所见为例,string类规定如果没有指定初值则生成一个空串:
std::string empty; //empty非显式地初始化为一个空串
Sales item item; //被默认初始化的 Sales item 对象
一些类要求每个对象都显式初始化,此时如果创建了一个该类的对象而未对其做明确的初始化操作,将引发错误。
《C++ Primer》 P40 标签:初始化,ld,变量,int,C++,对象,丢失 From: https://www.cnblogs.com/huvjie/p/18409738