可能重复:
复制初始化和直接初始化在 C++ 中有区别吗?
我刚开始学习C++。
为了用一个值初始化一个变量,我遇到了
int a = 0;
和
int a(0);
这让我很困惑。我可以知道哪个是最好的方法吗?
可能重复:
复制初始化和直接初始化在 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是一个类,而不是一个 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),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;