变量的三种初始化写法:=、()、{} 有什么区别?
三种写法效果相同:int a = 1、int b(2)、int c{3}。差别在严格程度——
{} 发现精度丢失会直接报错(int x{90.5} 编译失败),= 和 () 会默默截断。
{} 空写还能自动初始化为 0。现代 C++ 推荐 {}。
三种写法
int a = 1; // 拷贝初始化,最传统
int b(2); // 直接初始化,函数式写法
int c{3}; // 列表初始化,C++11 起
对基本类型,三行效果完全一样。请三种都认识——读别人的代码都会遇到。
{} 的严格性
int x = 90.5; // 编译通过,x 悄悄变成 90
int y{90.5}; // 编译报错:不允许丢失精度
用 = 或 () 时,把小数装进 int 会被默默截断;用 {} 则直接编译失败,把问题暴露在写代码的当下。这是 {} 被推荐的核心理由:让错误尽早出现。
另一个便利:int a{}; 不给值会自动初始化为 0,是"定义即清零"的紧凑写法。
一点历史感
老代码里 = 最多,2011 年以后的代码 {} 渐成主流。本系列的示例从本课起统一使用 {},与主流现代教材一致。{} 的真正价值到容器(装一组值的类型)才完全展现,数组和 STL 章节会回收这一点。
可视化观察
在 CppStudio 中打开本课示例,点击播放:
- 三个变量依次出现在监视区,值分别为 1、2、3——三种写法,同一个结果;
- 输出区一行显示
1 2 3; - 可以把示例里的
int c{3}改成int c{3.5}再运行,亲眼看一次编译报错——这是{}严格性的直接体验。
常见错误
- 以为 () 里能写多个值:
int b(1, 2);非法,基本类型一次只能初始化一个值; - 以为 = 也有检查:
int x = 90.5;不报错只截断,误以为程序正确; - 圆括号与花括号混写:
int c{3};写成int c({3});属于画蛇添足,按三种标准写法之一写即可。
下一课:auto 类型推导——让编译器根据初值自动判断类型。
▶ 运行本课示例 弹窗里直接跑,流程图同步展开;也可新窗口打开
常见问题
int a = 1 和 int b(2) 和 int c{3} 有什么区别?
对 int 这类基本类型效果相同,都是定义并给初值。差别在严格程度:{} 会检查精度丢失,int x{90.5} 直接编译报错,而 = 和 () 会默默截断成 90。
三种初始化应该选哪种?
现代 C++ 推荐 {}(列表初始化),因为它最严格、写法在各种场景下最统一。看别人的代码时三种都要认识。
int a{} 不给值可以吗?
可以,而且有用:{} 不给初值时自动初始化为 0。int a{}; 等价于 int a = 0;,这是 {} 独有的便利。