关于c ++:int a = 0和int a(0)的差异


int a = 0 and int a(0) differences

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Is there a difference in C++ between copy initialization and direct initialization?

我刚开始学习C++。

为了用一个值初始化一个变量,我遇到了

1
int a = 0;

1
int a(0);

这让我很困惑。我能知道哪条路最好吗?


int a = 0;int a(0);对机器生成的代码没有影响。它们是一样的。

以下是在Visual Studio中生成的程序集代码

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


它们都是一样的,所以没有一种"最佳方式"。

我个人使用

1
int a = 0;

因为我发现它更清晰,在实践中应用更广泛。

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


从实践的角度来看:我只使用int a = 0;

可以允许使用int a(0),但在实践中不能单独使用。

我认为这不应该在你的层面上打扰你,但让我们更进一步。

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

1
2
3
4
5
6
7
8
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数据成员data),
  • 新的:Demo *p=new Demo(a); // copy constructing a pointer


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

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

在非模板代码中,不需要int a(0)。完全取决于您是想使用int a(0)语法,还是更倾向于使用更传统的int a = 0语法。他们都做同样的事情。在我看来,后者更具可读性。


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

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

1
int a= 5; // explicit assignment

还可以使用隐式赋值将值赋给变量:

1
int a(5); // implicit assignment

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


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


区别在于,当您明确希望()初始化只接受一个参数时,例如:

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