百科问答小站 logo
百科问答小站 font logo



有人对 C++ 基本数据类型采用 int x{5}; 的方式进行初始化吗? 第1页

  

user avatar   pansz 网友的相关建议: 
      

C++11以上,应该是推荐这样用的吧。

传统用法的问题在于:同样一个 = 符号,有的时候会是初始化,有的时候会调用拷贝构造方法,有的时候会调用类型转换构造方法。还有的时候,它又代表了 = 操作符成员方法。

有多少C++程序员可以准确的回答,声明的时候使用=符号在哪种情况下会调用拷贝构造方法,哪种情况下会直接初始化?——如果你做不到准确判断,同时又坚持使用 = 符号初始化,程序的实际行为就很有可能跟你预期的不一样。

同样一个符号至少有四种可能的意思表达,在实际运用中是可能发生错误的。

而 {} 初始化方法的语义非常清晰而唯一。

C++在引入新特性方面,应该算是各种现代语言中最保守的一批了。如果连 C++ 语言都认为必须增加的特性,那么这个特性就很有可能是非常值得增加并且很有用的特性。


user avatar   wu-yong-wei-99 网友的相关建议: 
      

很正常的写法。至少有一个明显的好处:一旦类型不匹配,编译器立马报错。

示例:

       int n1 = 0.5; // 都不一定告警 int n2{0.5};  // 错误! short s1 = 65536; // 应该会告警 short s2{65536};  // 错误!      

另外,还有些只能用花括号的情况:

       std::byte b1 = 255; // 不能编译 std::byte b2{255};  // 正确初始化一个 byte      

所以,使用花括号很正常了。

反而是非基础数据类型要小心,不能到处用花括号。最明显的,凡对象本身有使用 initializer_list 的构造函数的,一定要小心区分使用 (){} 的场景。我经常举的例子是:

       std::vector<int> v1(3, 5); // 得到 {5, 5, 5} std::vector<int> v2{3, 5}; // 得到 {3, 5}      




  

相关话题

  Mac系统下有什么适合图形学的C++IDE?Clion还是VS? 
  golang 为什么没有三元运算符? 
  为什么大多数人用C++时都要用&&,||和!来表示与或非,而不是用and or not? 
  假如有某种力量使得世界上所有编译器都被删除了, 人类是否需要从打孔卡开始写第一个编译器? 
  老师要求我只能使用C++、C或者Java写算法,如何看这种做法? 
  高频交易中C++和Python的速度差异有多少? 
  qt5 msvc 版本如何检查内存泄漏? 
  实际工作中的 C++ 项目都是没有内存泄漏的么? 
  非计算机专业自学C++,有什么书籍推荐? ? 
  为什么这个程序电脑运行的结果和手机运行的不一样?数值小的时候一样? 

前一个讨论
用兔子代表中国是为什么?
下一个讨论
大学学习linux是安装虚拟机,还是安装双系统。?





© 2024-05-18 - tinynew.org. All Rights Reserved.
© 2024-05-18 - tinynew.org. 保留所有权利