简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:C++之浅拷贝和深拷贝总结。
<1>.C++浅拷贝和深拷贝的区别
C++中的浅拷贝和深拷贝是指在对象拷贝过程中,是否复制对象中的指针指向的数据。
浅拷贝 (Shallow Copy):
- 浅拷贝仅复制指针,而不复制指针指向的数据。
- 原对象和拷贝对象共享同一份数据。
- 当一个对象的生命周期结束,删除指针时,其他对象引用的数据也会被删除。
深拷贝(Deep Copy)
- 深拷贝复制指针和指针指向的数据,创建独立的副本。
- 原对象和拷贝对象拥有各自独立的数据副本。
- 当一个对象的生命周期结束,删除指针时,不会影响其他对象引用的数据。
2.应用实例
<1>.C++浅拷贝实例
#include<iostream>
#include<cstring>
class Person {
private:
char* name;
public:
Person(const char* n) {
name = new char[strlen(n) + 1];
strcpy(name, n);
}
// 拷贝构造函数
Person(const Person& other) {
name = other.name;
}
void printName() {
std::cout << "Name: " << name << std::endl;
}
};
int main() {
Person person1("Alice");
Person person2 = person1; // 浅拷贝
person1.printName(); // 输出:Name: Alice
person2.printName(); // 输出:Name: Alice
person1.printName(); // 修改共享内存
strcpy(person1.name, "Bob");
person1.printName(); // 输出:Name: Bob
person2.printName(); // 输出:Name: Bob,受到了person1的修改影响
return 0;
}
<2>.C++深拷贝实例
#include<iostream>
#include<cstring>
class Person {
private:
char* name;
public:
Person(const char* n) {
name = new char[strlen(n) + 1];
strcpy(name, n);
}
// 深拷贝的拷贝构造函数
Person(const Person& other) {
name = new char[strlen(other.name) + 1];
strcpy(name, other.name);
}
void printName() {
std::cout << "Name: " << name << std::endl;
}
};
int main() {
Person person1("Alice");
Person person2 = person1; // 深拷贝
person1.printName(); // 输出:Name: Alice
person2.printName(); // 输出:Name: Alice
person1.printName(); // 修改person1对应的内存
strcpy(person1.name, "Bob");
person1.printName(); // 输出:Name: Bob
person2.printName(); // 输出:Name: Alice,不受person1修改的影响
return 0;
}