题目
创建一个包含double*的类。构造函数通过调用new double并从构造函数参数为结果存储赋值来初始化double*。析构函数打印所指向的值,将该值赋值为-1,对存储调用delete,然后将指针设置为零。
现在创建一个函数,该函数按值获取类的对象,并在main()中调用此函数。会发生什么?通过编写一个拷贝构造函数来解决这个问题。
代码
#include<iostream>
using namespace std;
class A
{
public:
A(double x)
{
cout <<"构造函数:"<<endl;
d = new double(x);
}
A(const A& tem)//拷贝构造函数
{
cout <<"拷贝构造函数:"<<endl;
d = new double(*tem.d);
}
~A()
{
cout <<"析构函数:"<< *d <<endl;
*d = -1;
delete d;
d = nullptr;
}
double show(){return *d;}
private:
double* d;
};
void getres(A aa)
{
cout << "*d = "<<aa.show()<<endl;
}
int main()
{
A test(4.5);
getres(test);
return 0;
}
结果
原因:按值传参发生浅拷贝,在函数调用结束时,释放同一块内存,导致原始数据丢失
添加拷贝构造函数之后,函数调用结束后,释放拷贝的内存,原始的对象内存不受影响,可以正常析构。