c++ - 在 C++ 中初始化变量的偏好

标签 c++ variable-assignment copy-constructor assignment-operator

开始使用 C++ 并注意到您可以通过两种方式初始化变量

int example_var = 3;  // with the assignment operator '='

int example_var(3);  // enclosing the value with parentheses 

是否有理由使用一个而不是另一个?

最佳答案

第一种形式可以追溯到 C 时代,而第二种形式是在 C++ 中添加的。添加的原因是在某些上下文中(特别是构造函数中的初始化列表)不允许使用第一种形式。

这两者并不完全等同于所有类型,这就是其中一个或另一个可能更有用的地方。第一种形式在语义上意味着从右侧创建一个临时变量,然后从该临时变量复制构造。第二种形式,是从参数直接初始化变量。

什么时候重要?

如果没有从右侧到变量类型的隐式转换,或者如果复制构造函数不可用,第一种形式将失败,因此在这些情况下,您将不得不使用直接初始化。

第二种形式可以在比第一种形式更多的上下文中使用,但是它容易出现最令人烦恼的解析。也就是说,在某些情况下,语法将与函数声明(而不是常规变量的定义)兼容,并且语言确定在这种情况下,表达式将被解析为函数声明:

std::string s = std::string();  // ok declares a variable
std::string s( std::string() ); // declares a function: std::string s( std::string(*)() )

最后在 C++11 中有第三种形式,它使用花括号:

std::string s{std::string{}};

这种形式的优点是可以直接用括号初始化,但同时又不容易被误解。

使用哪个?

如果可用,我会推荐第三种选择。话虽这么说,我倾向于更频繁地使用第一个,或者第二个取决于上下文和类型......

关于c++ - 在 C++ 中初始化变量的偏好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12143841/

相关文章:

分配和后递增循环迭代器时的 C++ 无限循环(gcc 错误?)

使用 elif 的 Python 赋值和函数测试

c++ - 为什么这里不调用拷贝构造函数?

c++ - 我可以将指针传递给父类(super class),但创建子类的拷贝吗?

c++ - 关联容器,比较功能不是元素类型的一部分吗?

c++ - 本地餐厅自动早餐计费的问题 (c++)

c++ - 在 C++ 中重命名名称中带有破折号的文件

c++ - 检查一个整数是否是 O(1) 空间中的回文(错误答案)

C++获取字节数组中字符串后的短数字

c++ - 从引用复制构建