深复制 浅复制 最简单的记忆法则

ios中 所有带NSMutable的数据类型 copy 方法得到的都是浅copy不可变的数据类型 

否则用mutableCopy

int main(int argc, char *argv[]) {

@autoreleasepool {

NSMutableArray *original = [NSMutableArray arrayWithObjects:@"a", @"b",nil];  

NSMutableArray *shallowCopy = [original copy];  //得到的是不可变的NSArray

//NSMutableArray *shallowCopy = [original mutableCopy];  

NSMutableArray *deepCopy = [[NSMutableArray alloc] initWithArray:original copyItems:YES];  

    [shallowCopy removeObjectAtIndex:1];

NSLog(@"%@ %@",shallowCopy,deepCopy);

}

}

 


在 C++ 中,深复制(Deep Copy)指的是不仅复制对象本身,还复制对象所指向的动态内存数据,确保新对象和原对象拥有各自独立的数据副本。这通常用于管理堆分配资源的对象,例如包含指针成员的类。 ### 深复制实现方法 1. **自定义拷贝构造函数** 默认的拷贝构造函数执行的是浅拷贝(Shallow Copy),即只复制指针本身的值,并不复制指针指向的内容。因此需要手动编写拷贝构造函数来为新的对象分配新的内存空间,并将原始对象的数据复制到新分配的内存中。 2. **重载赋值运算符** 除了拷贝构造函数之外,还需重载 `=` 运算符以支持对象之间的深复制操作,避免两个对象共享同一块内存区域。 3. **析构函数释放资源** 如果类中含有动态分配的资源,则必须提供析构函数来释放这些资源,防止内存泄漏。 4. **遵循三法则(Rule of Three)** 在 C++ 中,如果类需要自定义析构函数、拷贝构造函数或拷贝赋值运算符中的任意一个,通常也需要自定义另外两个[^1]。 ### 示例代码 以下是一个完整的示例,展示如何通过深复制实现字符串类: ```cpp #include <iostream> #include <cstring> class MyString { private: char* data; public: // 构造函数 MyString(const char* str = "") { data = new char[strlen(str) + 1]; strcpy(data, str); } // 拷贝构造函数(深复制) MyString(const MyString& other) { data = new char[strlen(other.data) + 1]; strcpy(data, other.data); } // 拷贝赋值运算符 MyString& operator=(const MyString& other) { if (this != &other) { char* newData = new char[strlen(other.data) + 1]; strcpy(newData, other.data); delete[] data; data = newData; } return *this; } // 析构函数 ~MyString() { delete[] data; } void print() const { std::cout << data << std::endl; } }; int main() { MyString s1("Hello"); MyString s2 = s1; // 调用拷贝构造函数 MyString s3("World"); s3 = s1; // 调用拷贝赋值运算符 s1.print(); // 输出: Hello s2.print(); // 输出: Hello s3.print(); // 输出: Hello return 0; } ``` ### 解释 - `MyString(const char* str)` 是构造函数,负责为字符串分配内存并复制内容。 - `MyString(const MyString& other)` 是拷贝构造函数,它为新对象分配新内存并将原对象的字符串内容复制进去。 - `operator=` 函数负责处理赋值操作,首先检查是否是自我赋值,然后释放当前对象的内存,并分配新内存复制内容。 - `~MyString()` 析构函数释放分配的内存,避免内存泄漏。 上述方式确保了每个对象都拥有自己的独立数据副本,从而实现了深复制的目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值