利用指针将对象属性创建在堆区中,在析构函数执行时应该将堆区的数据清空.
利用深拷贝可以拷贝一个新的对象,将新对象的属性也创建在堆区中
#include<iostream>
using namespace std;
class Person {
private:
int age;
int *height;
public:
Person(int a,int p) {
age = a;
cout << "Person有参构造函数的调用" << endl;
height = new int(p);//用指针的方式在堆中创建数据 *height
}
Person(const Person& p) {
cout << "Person深拷贝函数调用" << endl;
cout << age<<endl;
height=new int(*p.height);//深拷贝的内容也应当创建在堆区
cout << *p.height<<endl;
}
~Person() {
cout << "Person析构函数的调用" << endl;
if (NULL != height) {
delete height;
height = NULL;//清除堆中的内存并指空指针
}
else;
}
};
void test01() {
Person p1(28, 160);
Person p2(p1);
}
int main() {
test01();
system("pause");
return 0;
}
测试结果:
根据栈的先进后出原则,第一个"析构函数的调用"是p2的释放时打印出的,第二个"析构函数的调用"是P1释放时打印出的