为什么 C++ 提供了两种初始化变量的方法?
第一种方法是C-type initialization
我们在定义变量的地方为变量赋值。
int a = 0;
另一种方法constructor initialization
是通过将初始值括在括号 () 之间来完成。
int a(0);
我的问题是 C++ 的创建者被迫引入初始化变量的新方法的原因是什么。尽管 C 风格的初始化正在完成这项工作。
为什么 C++ 提供了两种初始化变量的方法?
第一种方法是C-type initialization
我们在定义变量的地方为变量赋值。
int a = 0;
另一种方法constructor initialization
是通过将初始值括在括号 () 之间来完成。
int a(0);
我的问题是 C++ 的创建者被迫引入初始化变量的新方法的原因是什么。尽管 C 风格的初始化正在完成这项工作。
int a = 0;
存在于遗留(并且因为它感觉很自然,尤其是对于内置类型),并且int a(0)
存在于显式和一致性 - 在某些情况下,您可能需要一个更复杂的复制构造函数,它需要多个参数或其他类型的参数(转换构造函数) .
如果可以(即,如果适当的构造函数可用),编译器会将两者都int a = 0;
视为int a(0)
对复制构造函数的调用。此处解释了精确的行为。
我认为这是因为带有初始化列表的构造函数通常更快,我认为这与可以在更少的内存访问操作中将值放入新分配的变量内存的事实有关。这是关于该主题的 CPP 常见问题解答(顺便说一句,这是一个解决此类问题的好网站)。
基本上隐式是首选方式:
int nValue = 5; // explicit initialization
int nValue(5); // implicit initialization
以下是一些读物:
http://www.learncpp.com/cpp-tutorial/21-basic-addressing-and-variable-declaration/
当你使用第一种,也就是所谓的 C 类型初始化时,变量会被写入两次,第一次是默认值,第二次是赋值,至于第二种情况,它将直接设置为指定值。我认为现代编译器针对原始类型对此进行了优化,但对于对象而言,它可能会产生很大的不同。