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

时间:2012-06-02 16:43:14

标签: c++ constructor initialization

  

可能重复:
  When should you use direct initialization and when copy initialization?

我知道两者

int a = 1;

int a(1);

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

3 个答案:

答案 0 :(得分:11)

对于int,没有区别。 int a = 1;语法为 copy-initialziation ,而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
};

答案 1 :(得分:1)

当一切都是1和0时,两者最终都是一样的,只是保持一致。

答案 2 :(得分:1)

当您在示例中使用原始类型时,它没有任何区别。对于类,赋值形式在理论上效率较低,因为它可能涉及对复制构造函数的额外调用;但实际上我希望这个电话几乎总能被优化掉。

另一方面,第二种形式可能会出现在所谓的C++'s most vexing parse中,这是一种声明:

a b(c());

被解释为函数声明而不是变量定义。

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