针对题目“C/C++ 浅拷贝和深拷贝的实例详解”,我将为您提供一份完整的攻略。
什么是拷贝
在程序设计中,我们经常使用拷贝操作,将一个对象的内容复制到另一个对象中。在C/C++中,拷贝操作可以是浅拷贝或深拷贝,两者的区别在于拷贝时是否复制该对象所指向的堆内存。
浅拷贝
浅拷贝(Shallow Copy)是指拷贝一个对象时,只复制其值及其指针,而不会复制指针所指向的内存,因此拷贝完成后的对象和原对象会共享同一块内存。
示例1
#include <iostream>
using namespace std;
class Person {
public:
int age;
char *name;
Person(int age, char *name) {
this->age = age;
this->name = name;
}
void display() {
cout << "age: " << age << endl;
cout << "name: " << name << endl;
}
};
int main() {
char *name = "John";
Person p1(18, name);
p1.display();
Person p2 = p1; // 浅拷贝
p2.display();
// 修改p1的name
p1.name[0] = 'M';
p1.display();
p2.display();
return 0;
}
在上面的代码中,我们定义了一个Person
类,其中有两个成员变量age
和name
。我们创建了一个名为p1
的Person
对象,并将其名字设置为"John"。然后我们对p1
进行了浅拷贝操作,将其赋值给了一个新的Person
对象p2
。接下来,我们修改了p1
的名字为"Mohn",输出p1
和p2
的信息,得到的结果如下:
age: 18
name: John
age: 18
name: John
age: 18
name: Mohn
age: 18
name: Mohn
可以看到,修改了p1
的姓名之后,p2
的名字也跟着改变了,这就是浅拷贝的特点。
深拷贝
深拷贝(Deep Copy)是指拷贝一个对象时,不仅复制其值及其指针,还会复制指针所指向的内存,因此最终得到的对象和原对象所指向的内存地址不同。
示例2
#include <iostream>
#include <cstring>
using namespace std;
class Person {
public:
int age;
char *name;
Person(int age, char *name) {
this->age = age;
this->name = new char[strlen(name) + 1];
strcpy(this->name, name);
}
Person(const Person &p) { // 深拷贝
age = p.age;
name = new char[strlen(p.name) + 1];
strcpy(name, p.name);
}
void display() {
cout << "age: " << age << endl;
cout << "name: " << name << endl;
}
~Person() {
delete[] name;
}
};
int main() {
char *name = "John";
Person p1(18, name);
p1.display();
Person p2 = p1; // 深拷贝
p2.display();
// 修改p1的name
p1.name[0] = 'M';
p1.display();
p2.display();
return 0;
}
在上面的代码中,我们对Person
类进行了修改,添加了一个拷贝构造函数,用于实现深拷贝。然后我们创建了一个名为p1
的Person
对象,并将其名字设置为"John"。然后我们对p1
进行了深拷贝,将其赋值给了一个新的Person
对象p2
。接下来,我们 修改了p1
的名字为"Mohn",输出p1
和p2
的信息,得到的结果如下:
age: 18
name: John
age: 18
name: John
age: 18
name: Mohn
age: 18
name: John
可以看到,修改了p1
的姓名之后,p2
的名字并没有跟着改变,这是因为p1
和p2
指向的是不同的地址,它们之间不存在共享的情况。
小结
以上是关于浅拷贝和深拷贝的实例详解,浅拷贝只是简单地对指针进行复制,导致不同的对象指向了同一块内存地址,而深拷贝则是将指针所指向的内存一同进行复制,保证复制出来的对象是独立的。在实际的开发过程中,为了避免这样的错误,我们应该尽量使用深拷贝。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++ 浅拷贝和深拷贝的实例详解 - Python技术站