C++ 变量初始化

列表初始化

当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:

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
posted @   double64  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-09-12 C# WPF 联合 Halcon 环境测试:加载一张图片
点击右上角即可分享
微信分享提示