深浅拷贝
浅拷贝
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <iostream> using namespace std;
class Person { public: Person(int a,int Age) { age = Age num = new int(a); } Person() { cout <<"默认无参"<<endl; } Person(const Person &p) { this->num = p.num; cout<<"浅拷贝" <<endl; } ~Person() { if(num!=NULL) { delete num; num = NULL; } cout <<"析构函数"<<endl; }
int age int *num; }; int main() { Person p1(10,66); Person p2(p1); cout << *p1.num<<endl; cout << *p2.num<<endl;
}
|
运行结果:程序崩溃(CLion)
存在的问题和解决方法
深拷贝
<先进后出,所以拷贝的先被释放>
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class Person { public: Person() { cout << "无参构造函数!" << endl; } Person(int age ,int height) { cout << "有参构造函数!" << endl;
m_age = age; m_height = new int(height); } Person(const Person& p) { cout << "拷贝构造函数!" << endl; m_age = p.m_age; m_height = new int(*p.m_height); }
~Person() { cout << "析构函数!" << endl; if (m_height != NULL) { delete m_height; } } public: int m_age; int* m_height; };
void test01() { Person p1(18, 180);
Person p2(p1);
cout << *p1.m_height << endl;
cout << *p2.m_height << endl; }
int main() {
test01();
system("pause");
return 0; }
|
总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题