今天我看到一个我不熟悉的类的 C++ 初始化。
CPrice price = CPrice();
初始化通常应该是这样的
CPrice price;
我猜第一个应该抛出错误或其他东西。
这里会发生什么?我猜想该变量位于堆栈上,因为它没有用new
.
我使用 Visual Studio Express 2012 和 Microsoft C++ 编译器。这可能是微软编译器特定的东西,因此是允许的吗?
这两行都非常好,并且从客户端代码的角度来看,最终具有相同的可观察行为:price
是类型的默认构造变量CPrice
,当然是在堆栈上分配的。
如果您想深入了解技术细节,它们并不相同:
CPrice price;
是变量的默认初始化price
类型的CPrice
。这是一个用户类型(即类),因此它始终意味着对默认构造函数的调用。
CPrice price = CPrice();
是一个复合表达式,它做两件事:
-
CPrice()
: 初始化和匿名CPrice
对象(在堆栈上),通过直接初始化(它调用构造函数()
)。由于括号是空的,这将调用默认构造函数。
- 然后,它会复制初始化(在 C++11 之前)/移动初始化(适用于 C++11 及以上)变量
price
类型的CPrice
,复制/移动的对象是匿名的CPrice
实例。
复制构造函数存在的最长分配力CPrice
,否则代码会出错。但允许编译器跳过复制构造并将其优化掉,通过发出与最短形式相同的代码。
此外,在 C++11 中,如果存在移动构造函数CPrice
,在这种情况下,它将用来代替复制构造函数(也就是说,如果该操作无论如何都没有完全删除)。
因此,唯一可察觉的区别是,即使CPrice
不可复制构造。两种形式都需要CPrice
默认可构造。
来自另一个答案的或多或少的相关精度。你可能会认为假想像这样的中间立场声明是相同的:
CPrice price();
然而,它实际上完全不同:这个声明price
是一个不带参数(空括号)的函数,并返回一个CPrice
。它通俗地称为最麻烦的解析.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)