疑惑产生于之前写的Sales_item类:
class Sales_item
{
public:
string isbn;
int number;
double price;
public:
Sales_item();
Sales_item(string isbn, int number, double price);
};
Sales_item::Sales_item()
{
Sales_item("",0,0.0);
}
Sales_item::Sales_item(string isbn, int number, double price)
{
this->isbn = isbn;
this->number = number;
this->price = price;
}
void main()
{
Sales_item books;
}
按理说,main中books.number的值应该是0,可是我打印出来一看,却是一个随机数。于是查资料,才知道了其中的奥秘。
为何直接调用Sales_item("",0,0.0),结果number、price并不是0,而是一个随机的数?
原因在于执行Sales_item("",0,0.0)时,并不是用这一构造函数来初始化当前的内存区域,而是初始化了一个临时对象的内存区。如果想要达到效果,应该使用placement new(定位new表达式),即无参构造函数中应该改为:
new(this) Sales_item("",0,0.0);
定位new表达式:其作用是在已分配的原始内存中初始化一个对象,它与new的其他版本不同之处在于它并不分配内存。
表达式的两种形式:
new (place_address) type
或者
new (place_address) type(initializer-list)
place_address必须是一个指针