改变了一下赋值的顺序,为什么析构函数调用次数就不同了
Stock.cpp
#include "Stock.h"
#include <string>
#include <iostream>
using namespace std;
Stock::Stock(string name, double price) {
cout << "with param constractor" << endl;
Stock::m_name = name;
Stock::m_price = price;
}
Stock::Stock(double price) {
Stock::m_name = "defautl name";
Stock::m_price = price;
cout << "with param constractor" << endl;
}
Stock::Stock() {
cout << "with no param constractor" << endl;
}
Stock::~Stock() {
cout << "destory stock name:" << Stock::m_name << " ByeBye!" << endl;
}
#ifndef STOCK_H_
#define STOCK_H_
#include <string>
#include <iostream>
using namespace std;
class Stock {
private:
string m_name;
double m_price;
public:
Stock::Stock();
Stock::Stock(double price = 0.0);
Stock::Stock(string name = "defalut name", double price = 0.0);
virtual ~Stock();
};
#endif /* STOCK_H_ */
Stock myStock=2;
myStock=Stock("a",1.0);
myStock=Stock("abcde",3.0);
Stock myStock=Stock("a",1.0);
myStock=2;
myStock=Stock("abcde",3.0);
[解决办法]
第一次直接用2来初始化对象。
第二次是用2构造了一个临时对象。调用的复制构造函数构造临时对象。然后再用析构函数析构
[解决办法]
Stock myStock=2;
myStock = 2;//等价于myStock = Stock(2);先创建一个临时对象。。再赋值给myStock。。
Stock myStock=2;
这个是通过调用Stock(double price);来初始化myStock。。并没有创建临时对象。。
myStock = 2;//等价于myStock = Stock(2);先创建一个临时对象。。再赋值给myStock。。
这里多创建了一个对象。。当然析构也多一次。。
都是三个对象,就是赋值顺序不同
第一次直接用2来初始化对象。
第二次是用2构造了一个临时对象。调用的复制构造函数构造临时对象。然后再用析构函数析构
myStock = 2; 这个对象后来被销毁了,
因为myStock=Stock("a",1.0);
那为什么没有调用2这个对象的析构函数呢
Stock myStock=2;
这个是通过调用Stock(double price);来初始化myStock。。并没有创建临时对象。。
myStock = 2;//等价于myStock = Stock(2);先创建一个临时对象。。再赋值给myStock。。
这里多创建了一个对象。。当然析构也多一次。。
代码里最好加上一个拷贝构造函数,Stock::Stock(Stock & s);
---------------------------------------情况1
Stock myStock = 2;
myStock = Stock("a", 1.0);
normal 1 没有临时对象产生
normal 2
destory stock name:a ByeBye! 临时1对象删除
destory stock name:a ByeBye!
---------------------------------------情况2
Stock myStock = Stock("a", 1.0);
myStock = 2;
normal 2
copy stock name:a
destory stock name:a ByeBye! 临时1对象删除
normal 1
destory stock name:defautl name ByeBye! 临时2对象删除(为什么会产生临时2对象呢)
destory stock name:defautl name ByeBye!
Stock myStock=2;
这个是通过调用Stock(double price);来初始化myStock。。并没有创建临时对象。。
myStock = 2;//等价于myStock = Stock(2);先创建一个临时对象。。再赋值给myStock。。
这里多创建了一个对象。。当然析构也多一次。。
正解,不理解可以单步调试看,F9+F10+F11
两次都是三个对象,构造函数都调用了三次
担是析构函数调用次数不同