在C+中初始化变量的首选项+; 从C++开始,注意到可以用两种方式初始化变量 int example_var = 3; // with the assignment operator '='

在C+中初始化变量的首选项+; 从C++开始,注意到可以用两种方式初始化变量 int example_var = 3; // with the assignment operator '=',c++,variable-assignment,copy-constructor,assignment-operator,C++,Variable Assignment,Copy Constructor,Assignment Operator,或 是否有理由使用一个而不是另一个呢?它们编译成相同的东西。但是,这两种变量都是变量初始化,而不是赋值,这在C中有点小,而C++中有很多,因为调用了完全不同的函数(构造函数V赋值)。 但对于自定义数据类型,它们的含义可能不同。第一种格式称为复制初始化,而第二种格式称为直接初始化 读得好: 它们的输出是相同的。。。 这两种语法都调用复制构造函数。 对于int和其他类似的内置数据类型,虽然用户定义数据类型有一些不同,但第一个表单可以追溯到C时间,而第二个则是在C++中添加的。添加的原因是,在某些上下


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

它们编译成相同的东西。但是,这两种变量都是变量初始化,而不是赋值,这在C中有点小,而C++中有很多,因为调用了完全不同的函数(构造函数V赋值)。 但对于自定义数据类型,它们的含义可能不同。第一种格式称为复制初始化,而第二种格式称为直接初始化

读得好:


它们的输出是相同的。。。 这两种语法都调用复制构造函数。
对于int和其他类似的内置数据类型,虽然用户定义数据类型有一些不同,但第一个表单可以追溯到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{}};
这种形式具有使用括号直接初始化的优点,但同时不容易被误解

用哪一个


如果可以的话,我会推荐第三种选择。也就是说,我倾向于更频繁地使用第一个,或者根据上下文和类型使用第二个…

正如您所知,如果您在自己的类型上进行测试,
MyClass obj=5
调用构造函数,而不是赋值运算符。我也知道以前有人问过这个问题;我会尽力找到它去了哪里。从技术上讲,这两个都不是作业。它们是初始化。它们定义并初始化一个新变量。将新值分配给现有变量时发生赋值。(
int i=1
是初始化,但
i=2
是赋值)
std::string s{std::string{}};