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

Psy*_*nut 37 c++

可能重复:
复制初始化和直接初始化之间的C++是否存在差异?

我刚开始学习C++.

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

int a = 0;
Run Code Online (Sandbox Code Playgroud)

int a(0);
Run Code Online (Sandbox Code Playgroud)

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

小智 57

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

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

int a = 10;   // mov dword ptr [a],0Ah  
int b(10);    // mov dword ptr [b],0Ah  
Run Code Online (Sandbox Code Playgroud)

  • 但是,仅仅因为生成的代码相同,并不意味着语言功能是相同的.试图通过Black Box方法学习语言,如"运行程序"和/或"检查程序集"通常会导致大量的误解. (21认同)
  • 我喜欢汇编代码中显示的示例. (12认同)

Luc*_*ore 22

他们都是一样的,所以真的没有一个"最好的方式".

我个人用

int a = 0;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Dainius不,他们不是. (3认同)
  • 类别B b(a); 和B b = a; 实际上是相同的,都使用复制构造函数初始化.所以没有什么不同.B b; B = A; 使用assign运算符,然后你完全有其他情况. (2认同)
  • @Dainius见http://stackoverflow.com/questions/11222076/why-is-copy-constructor-called-instead-of-conversion-constructor (2认同)

AnT*_*AnT 5

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

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

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


X''*_*X'' 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
Run Code Online (Sandbox Code Playgroud)

在这个例子中都b(a)c=a做的一样,我会用拳头解决方案气馁.我的理由是,这看起来类似于c(2)参数构造.

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

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


归档时间:

查看次数:

14820 次

最近记录:

12 年,10 月 前