为什么有两种方法来初始化变量
why two ways to variable initialization
为什么c++给出了两种初始化变量的方法?
第一种方法是C-type initialization
,我们在定义变量的地方赋值。
int a = 0;
另一种方法是constructor initialization
,它通过将初始值包含在括号()中来完成。
int a(0);
我的问题是,是什么原因迫使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类型初始化时,变量将被写入两次,第一次是默认值,第二次是赋值,对于第二种情况,它将被直接设置为指定值。我认为现代编译器对基本类型进行了优化,但对于对象来说,这可能会有很大的不同。
相关文章:
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 在 C++ 中访问 lambda 捕获初始化变量
- 为什么C++不支持对未初始化变量进行智能分析?
- 使用 clang++ 和 g++ 在C++中初始化变量
- C++使用 lambda 初始化变量
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++ - 输出与初始化变量不同?
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- C++ 中的初始化变量
- C++中未初始化变量的值
- 如何在需要提及需要循环声明的其他类的类中初始化变量?
- 我想知道在构造函数中初始化变量时的生命周期
- 读取恰好具有良好值的未初始化变量
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- 为什么在 c++ 中有多种初始化变量的方法
- 没有参数的默认构造函数是否总是初始化变量?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 使用构造函数跳闸UB的新放置后使用初始化变量