为什么有两种方式来初始化变量

why two ways to variable initialization

为什么C++给出了两种初始化变量的方法?

第一种方法是C-type initialization我们在定义变量的地方给变量赋值。

int a = 0;

另一种方式,constructor initialization 是通过将初始值括在括号 () 中来完成的。

int a(0);

我的问题是 C++ 的创建者被迫引入初始化变量的新方法的原因是什么。虽然 C 风格的初始化正在做这项工作。

基本上隐式是首选方式:

int nValue = 5; // explicit initialization

int nValue(5); // implicit initialization

这里有一些读物:

http://www.learncpp.com/cpp-tutorial/21-basic-addressing-and-variable-declaration/

Explicit Assignment vs Implicit Assignment

int a = 0; 存在于遗留(并且因为它感觉自然,特别是对于内置类型),并且 int a(0) 存在于明确性和一致性 - 在某些情况下您可能需要更复杂的采用多个参数或其他类型参数的复制构造函数(转换构造函数)。

如果可以(即如果合适的构造函数可用),编译器会将 int a = 0;int a(0) 都视为对复制构造函数的调用。解释了精确的行为 here

我认为这是因为带有初始化列表的构造函数通常更快,我 认为 这与值可以放入新分配的变量内存中这一事实有关在更少的内存访问操作中。 Here 是关于该主题的 CPP 常见问题解答(顺便说一句,这是一个解决此类问题的好网站)。

当你使用第一种,也就是所谓的C型初始化时,变量会被写入两次,第一次是默认值,第二次是赋值,至于第二种情况会直接设置为指定值.我认为现代编译器针对原始类型对此进行了优化,但对于对象而言,它可能会产生很大的不同。