今天我看到了一个我不熟悉的C++类初始化。
CPrice price = CPrice();
初始化通常应该像这样:
CPrice price;
我本以为第一个应该会报错之类的。
这里会发生什么?我猜测变量在堆栈上,因为它没有用new
初始化。
我使用Visual Studio Express 2012和微软的C++编译器。这可能是微软编译器特有的东西,因此被允许吗?
今天我看到了一个我不熟悉的C++类初始化。
CPrice price = CPrice();
CPrice price;
我本以为第一个应该会报错之类的。
这里会发生什么?我猜测变量在堆栈上,因为它没有用new
初始化。
我使用Visual Studio Express 2012和微软的C++编译器。这可能是微软编译器特有的东西,因此被允许吗?
CPrice price();
price
定义为一个不带参数的函数(空括号),返回值为 CPrice
。俗称为“最棘手的解析”。赋值操作会在实例已经被声明时调用赋值运算符(如果未被删除)。第一行声明并显式调用构造函数,在堆上使用多态性更有帮助,但在栈上不是很有用。第二行直接调用其默认构造函数(如果未被删除且未实现operator())。
如果您仍然想知道operator=,则在类声明中显式声明
CPrice & operator = (const CPrice &) = delete;
CPrice price();
,因为这个和你第一个例子一样,可以在有参数的情况下传递参数,而第二个则不能。此外,在像这样的简单情况下,如果没有使用new关键字,则分配将在堆栈上进行。CPrice price();
并不是你想象中的那样:它是一个声明了一个名为 price
的函数,该函数不带参数并返回一个 CPrice
对象。请参阅 most vexing parse 文章。 - Nik BougalisCPrice price = CPrice();
和CPrice price(CPrice());
在定义上是相同的,而CPrice price;
则在原则上有所不同。 - luk32
=
,你就知道它已经初始化了。 - NathanOliverCPrice()
是一个构造函数,返回一个分配给新声明变量的对象... - 463035818_is_not_a_number=
表示复制。根据定义,CPrice price = CPrice();
和CPrice price(CPrice());
是相同的。欢迎来到 C++ 语法怪癖的世界。 - luk32CPrice
是否为用户类型(例如,您正在编写模板代码,或者某人已经使用了using CPrice = int
),那么第一次初始化更加安全,否则price
可能未被初始化。 - Chris Drew