国外 外贸 网站 源码,ui设计就业方向有哪些?,和朋友合伙做网站,安康企业网站定制C 中的拷贝方式
1. 深拷贝#xff08;Deep Copy#xff09;
定义
深拷贝会复制对象的全部内容#xff0c;包括对象中动态分配的资源。新对象与原对象完全独立#xff0c;任何对新对象的修改都不会影响原对象。
实现
通常通过显式的拷贝构造函数或拷贝赋值运算符#…C 中的拷贝方式
1. 深拷贝Deep Copy
定义
深拷贝会复制对象的全部内容包括对象中动态分配的资源。新对象与原对象完全独立任何对新对象的修改都不会影响原对象。
实现
通常通过显式的拷贝构造函数或拷贝赋值运算符手动分配新内存并复制资源。
示例
#include iostream
#include cstringclass MyClass {char* data;public:MyClass(const char* str) {data new char[strlen(str) 1];strcpy(data, str);}// 深拷贝构造函数MyClass(const MyClass other) {data new char[strlen(other.data) 1];strcpy(data, other.data);}~MyClass() {delete[] data;}void print() const {std::cout data \n;}
};int main() {MyClass obj1(Hello);MyClass obj2 obj1; // 调用深拷贝构造函数obj2.print(); // 输出: Helloreturn 0;
}特点
1.深拷贝是安全的原对象和新对象的资源完全独立。 2.对象中有动态资源时需要手动实现深拷贝。 3.较耗费性能特别是资源较大时。
2. 浅拷贝Shallow Copy
定义
浅拷贝只复制对象中的指针或引用而不复制它们所指向的实际资源。新对象和原对象共享同一块资源。
问题
如果不小心释放了共享的资源会导致其他对象指向无效的内存产生 悬挂指针Dangling Pointer。
示例
#include iostream
#include cstringclass MyClass {char* data;public:MyClass(const char* str) {data new char[strlen(str) 1];strcpy(data, str);}// 默认浅拷贝未自定义拷贝构造函数时MyClass(const MyClass other) default;~MyClass() {delete[] data;}void print() const {std::cout data \n;}
};int main() {MyClass obj1(Hello);MyClass obj2 obj1; // 浅拷贝指向同一资源obj1.print(); // 输出: Helloobj2.print(); // 输出: Helloreturn 0;
}特点
1.浅拷贝速度快因为它仅复制指针的地址。 2.容易产生悬挂指针或资源泄漏问题。
3. 移动语义Move Semantics
定义
移动语义会将资源从一个对象“转移”到另一个对象而不会创建或复制新的资源。原对象的资源被“搬走”进入“有效但未定义状态”。
实现
使用移动构造函数和移动赋值运算符。
示例
#include iostream
#include utility // for std::moveclass MyClass {char* data;public:MyClass(const char* str) {data new char[strlen(str) 1];strcpy(data, str);}// 移动构造函数MyClass(MyClass other) noexcept : data(other.data) {other.data nullptr; // 释放原对象的所有权}~MyClass() {delete[] data;}void print() const {std::cout (data ? data : Empty) \n;}
};int main() {MyClass obj1(Hello);MyClass obj2 std::move(obj1); // 调用移动构造函数obj2.print(); // 输出: Helloobj1.print(); // 输出: Emptyreturn 0;
}特点
1.移动语义速度快不需要深拷贝。 2.常用于临时对象或需要高效转移资源的场景。 3.需要实现移动构造函数和移动赋值运算符。
4. 对比总结
拷贝方式深拷贝浅拷贝移动语义实现复杂度较高需要手动复制资源简单默认行为需要手动实现移动构造和赋值效率慢涉及内存分配和复制快只复制指针非常快只转移资源所有权资源独立性独立的资源副本共享资源资源被转移独占适用场景资源独立且需频繁复制快速拷贝无需独立资源资源需要转移时高效操作
5.总结
深拷贝适用于需要独立资源的场景比如资源管理类文件、内存等。浅拷贝简单但容易导致问题仅适用于无需独立资源的情况。移动语义是现代 C 的高效资源管理方式适合转移资源的场景。