从 c++ 开始,并注意到您可以通过两种方式初始化变量
int example_var = 3; // with the assignment operator '='
或者
int example_var(3); // enclosing the value with parentheses
有理由使用其中一个吗?
从 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{}};
这种形式具有带括号直接初始化的优点,但同时也不易产生误解。
使用哪一个?
如果可以的话,我会推荐第三种选择。话虽如此,我倾向于使用第一个,或者第二个取决于上下文和类型......
对于内置类型,int
两者的含义相同。
但对于自定义数据类型,它们可能意味着不同。第一种格式称为Copy Initialization,第二种称为Direct Initialization。
好读:
它们的输出是相同的......这两种语法都调用了复制构造函数。对于 int 和其他类似的内置数据类型,它是相同的,尽管用户定义的数据类型存在一些差异。
他们编译成同样的东西。但是,两者都是变量初始化的一种形式,而不是赋值,这在 C 中很重要,在 C++ 中很重要,因为调用了完全不同的函数(构造函数与赋值)。