可能重复:
复制初始化和直接初始化之间的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)
Luc*_*ore 22
他们都是一样的,所以真的没有一个"最好的方式".
我个人用
int a = 0;
Run Code Online (Sandbox Code Playgroud)
因为我发现它更清楚,并且在实践中被更广泛地使用.
这适用于类型所在的代码int.对于类类型,第一个是复制初始化,而另一个是直接初始化,因此在这种情况下它会有所不同.
没有"最好"的方式.对于标量类型(如int您的示例中),两种形式具有完全相同的效果.
int a(0)引入了非类类型的语法以支持类和非类类型的统一直接初始化语法,这在类型无关(模板)代码中非常有用.
在非模板代码中,int a(0)不需要.无论您是想使用int a(0)语法还是更喜欢使用更传统的语法,完全取决于您int a = 0.两者都做同样的事情.在我看来,后者更具可读性.
从实际的角度来看:我只会用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 次 |
| 最近记录: |