c++浅拷贝和深拷贝的例子
时间: 2023-09-25 16:14:31 浏览: 76
浅拷贝和深拷贝是在C++中涉及对象拷贝构造函数和赋值运算符重载的概念。
浅拷贝是指将对象的成员变量简单地逐位复制到另一个对象,这会导致两个对象的成员变量共享同一块内存。而深拷贝则是创建一个新的对象,并将原对象的成员变量逐位复制到新对象中,两个对象的成员变量分别占用不同的内存空间。
下面是一个示例代码:
```cpp#include <iostream>
#include <cstring>
class String {
private:
char* data;
int size;
public:
// 构造函数 String(const char* str) {
size = strlen(str);
data = new char[size +1];
strcpy(data, str);
}
// 拷贝构造函数 String(const String& other) {
size = other.size;
data = new char[size +1];
strcpy(data, other.data);
}
// 赋值运算符重载 String& operator=(const String& other) {
if (this == &other) {
return *this;
}
delete[] data;
size = other.size;
data = new char[size +1];
strcpy(data, other.data);
return *this;
}
// 析构函数 ~String() {
delete[] data;
}
void print() {
std::cout << data << std::endl;
}
};
int main() {
String str1("Hello");
String str2 = str1; // 浅拷贝 String str3("World");
str3 = str1; // 深拷贝 str1.print(); // 输出 "Hello"
str2.print(); // 输出 "Hello"
str3.print(); // 输出 "Hello"
return0;
}
```
在上面的示例中,`String` 类包含了一个字符数组 `data` 和一个整数 `size`,用于存储字符串和字符串长度。在构造函数中,我们使用 `new` 运算符为 `data` 动态分配内存,并将传入的字符串复制到 `data` 中。在拷贝构造函数中,我们也是通过动态分配内存并复制成员变量来实现拷贝。在赋值运算符重载函数中,我们首先释放原有的内存,然后再进行深拷贝。
在 `main` 函数中,我们创建了三个 `String` 对象:`str1`、`str2` 和 `str3`。其中,`str2` 是通过拷贝构造函数进行浅拷贝得到的,而 `str3` 是通过赋值运算符重载进行深拷贝得到的。最后,我们分别打印了三个对象的内容,可以看到浅拷贝的对象共享同一块内存,而深拷贝的对象拥有独立的内存空间。
阅读全文