C++ 是否认为在c+中使用类似c的初始化或构造函数初始化更好+;?

C++ 是否认为在c+中使用类似c的初始化或构造函数初始化更好+;?,c++,constructor,initialization,C++,Constructor,Initialization,可能重复: 我都知道 int a = 1; 及 C++中工作,但哪一个被认为是更好的使用?< P>在所有的1s和0时,都是相同的,只是一致。 < > int 没有区别。inta=1语法是复制初始化,而int a(1)是直接初始化。即使对于一般的类类型,编译器也几乎可以保证生成相同的代码,但是复制初始化要求类不具有声明为explicit的复制构造函数 为了说明这一点,直接初始化直接调用相应的构造函数: T x(arg); 另一方面,复制初始化的行为“如同”复制: T x = arg; /

可能重复:

我都知道

int a = 1;


C++中工作,但哪一个被认为是更好的使用?

< P>在所有的1s和0时,都是相同的,只是一致。

< > <代码> int <代码>没有区别。
inta=1语法是复制初始化,而
int a(1)是直接初始化。即使对于一般的类类型,编译器也几乎可以保证生成相同的代码,但是复制初始化要求类不具有声明为
explicit
的复制构造函数

为了说明这一点,直接初始化直接调用相应的构造函数:

T x(arg);
另一方面,复制初始化的行为“如同”复制:

T x = arg; // "as if" T x(T(arg));, but implicitly so
明确允许并鼓励复制省略,但“似乎”构造必须仍然有效,即复制构造函数必须是可访问的,而不是明确的或删除的。例如:

struct T
{
    T(int) { } // one-argument constructor needed for `T x = 1;` syntax

    // T(T const &) = delete;            // Error: deleted copy constructor
    // explicit T(T const &) = default;  // Error: explicit copy constructor
    // private: T(T const &) = default;  // Error: inaccessible copy constructor
};

当您在示例中使用基元类型时,这没有任何区别。对于类,赋值形式在理论上效率较低,因为它可能涉及对副本构造函数的额外调用;然而,在实践中,我希望这个调用几乎总是被优化掉

另一方面,第二种形式可能出现在所谓的语句中,即:

a b(c());
被解释为函数声明而不是变量定义


我认为第二个问题比第一个问题更令人担忧,所以我一直使用变量定义的赋值方式。

在99.99%的情况下,这并不重要。使用您喜欢的一个。搜索“C++初始化vs赋值”@crawgar23:问题中的两个示例都执行初始化。两者都不执行赋值。@James如果您按照我的建议进行搜索,那么您将得到诸如和关于堆栈溢出的问题之类的文章,这些文章解释了在C++11中您也可以执行
inta{1}用大括号括起来:)+1,用于指出客观差异。如果类有移动构造函数,则没有复制构造函数是可以的,对吗?@FredOverflow:是的,当然有相同的非明确性要求。
a b(c());