int a = 0 and int a(0) differences

int a = 0 and int a(0) differences

本文关键字:int differences and      更新时间:2023-10-16

可能的重复项:
副本初始化和直接初始化在C++上是否有区别?

我刚开始学习C++。

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

int a = 0;

int a(0);

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

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

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

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

它们都是一样的,所以真的没有一种"最好的方法"。

我个人使用

int a = 0;

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

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

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

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

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

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

int a(0)可能是允许的,但在实践中永远不会使用。


我认为这不应该打扰你的水平,但让我们走得更远。

假设a是一个类,而不是一个整数。

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(int i):data(i){} ),
  • 新品:Demo *p=new Demo(a); // copy constructing a pointer
就是

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

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

int a= 5; // explicit assignment

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

int a(5); // implicit assignment

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

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

不同之处在于,()初始化是当您明确希望它只接受一个参数时,例如:

您可以:

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