int a = 0和int a(0)差异

时间:2012-12-06 07:40:19

标签: c++

  

可能重复:
  Is there a difference in C++ between copy initialization and direct initialization?

我刚开始学习C ++。

要使用值初始化变量,我遇到了

int a = 0;

int a(0);

这让我很困惑。我可以知道哪种方式最好吗?

7 个答案:

答案 0 :(得分:56)

int a = 0;int a(0);在机器生成的代码中没有任何区别。他们是一样的。

以下是在Visual Studio中生成的汇编代码

int a = 10;   // mov dword ptr [a],0Ah  
int b(10);    // mov dword ptr [b],0Ah  

答案 1 :(得分:22)

它们都是一样的,所以没有一个“最佳方式”

我个人使用

int a = 0;

因为我发现它更清晰,并且在实践中被更广泛地使用。

这适用于您的代码,类型为int。对于类类型,第一个是复制初始化,而另一个是直接初始化,因此在这种情况下它会产生差异

答案 2 :(得分:5)

没有“最好的”方式。对于标量类型(例如示例中的int),两种形式都具有完全相同的效果。

引入了非类类型的int a(0)语法,以支持类和非类类型的统一直接初始化语法,这在类型无关(模板)代码中非常有用。

在非模板代码中,不需要int a(0)。完全取决于您是否要使用int a(0)语法,或者更喜欢坚持使用更传统的int a = 0语法。两者都做同样的事情。在我看来,后者更具可读性。

答案 3 :(得分:5)

从实际角度来看:我使用int a = 0;

int a(0)可能被允许但从未在实践中使用过。


我认为不应该在你的关卡上打扰你,但让我们走得更远。

假设a是一个类,而不是一个int。

class Demo{
public:
  Demo(){}; 
  Demo(int){};
};
Demo a;
Demo b(a);   
Demo c = a;  // clearly expressing copy-init

在这个例子中,b(a)c=a都做同样的事情,我会阻止你使用第一个解决方案。我的理由是,这看起来类似于c(2),它是来自参数的构造。

此支架式初始化只有两个有效用途

  • 初始化列表(Demo(int i):data(i){}如果Demo有一个int数据成员data),
  • new's:Demo *p=new Demo(a); // copy constructing a pointer

答案 4 :(得分:2)

就这么简单。 (好吧,几乎 - 有些事情你不能命名你的变量,我们将在下一节讨论)

您还可以在声明时为变量赋值。当我们使用赋值运算符(等号)为变量赋值时,它被称为显式赋值:

int a= 5; // explicit assignment

您还可以使用隐式赋值为变量赋值:

int a(5); // implicit assignment

即使隐式赋值看起来很像函数调用,编译器也会跟踪哪些名称是变量,哪些是函数,以便正确解析它们。

答案 5 :(得分:0)

不同之处在于()初始化是指您明确希望它仅采用一个参数,例如:

你可以:
int a = 44 + 2;
但你不能:
int a(44) + 2;

答案 6 :(得分:0)

在教科书和文献中,一个是直接初始化,另一个是复制初始化。但是,就机器代码而言,没有区别。