C++中的深拷贝与浅拷贝
C++的深拷贝与浅拷贝
本文转自doc.guandang.net
对于普通类型的对象来说,它们之间的复制是很简单的,例如:
int a=88;
int b=a;
而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。
01 #include <iostream>
02 using namespace std;
03
04 class CExample {
05 private:
06 int a;
07 public:
08 CExample(int b)
09 { a=b;}
10 void Show ()
11 {
12 cout<<a<<endl;
13 }
14 };
15
16 int main()
17 {
18 CExample A(100);
19 CExample B=A;
20 B.Show ();
21 return 0;
22 }
运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象B分配了内存并完成了与对象A的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面举例说明拷贝构造函数的工作过程。
01 #include <iostream>
02 using namespace std;
03
04 class CExample {
05 private:
06 int a;
07 public:
08 CExample(int b)
09 { a=b;}
10
11 CExample(const CExample& C)
12 {
13 a=C.a;
14 }
15 void Show ()
16 {
17 cout<<a<<endl;
18 }
19 };
20
21 int main()
22 {
23 CExample A(100);
24 CExample B=A;
25 B.Show ();
26 return 0;
27 }
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
(1)一个对象以值传递的方式传入函数体
(2)一个对象以值传递的方式从函数返回
(3)一个对象需要通过另外一个对象进行初始化。
如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。
自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。
浅拷贝和深拷贝
在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新
C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝 C++本质:类的赋值运算符=...和赋值运算符 下面介绍类的赋值运算符 1.C++中对象的内存分配方式 在 C++中...
数据结构与算法实验报告姓名 冯洪松 学号 实验项目 200800820136 日期 指导教 师 2010-12-3 赵晓辉深拷贝与浅拷贝 一、上机实验的问题和要求(需求分析) : 1、...
C++类对象的深拷贝、浅拷贝构造函数学习过类的构造函数和析构函数的相关知识,...拷贝构造函数来完成这个过程, 上面代码的复制核 心语句就是通过 Test(Test &c...
深拷贝和浅拷贝的区别拷贝构造函数,经常... } 上面的 =重载其是就是实现了浅拷贝原因.是由于对象之中含有指针数据类型....
浅拷贝资源后在释放资源的时候会产生资源归属不清的情况导致程序运行出错。 Test(Test &c_t)是自定义的拷贝构造函数,拷贝构造函数的名称必须与类名称一致,函数的...
深拷贝与浅拷贝的区别_经济/市场_经管营销_专业资料。6(7)_结构体的应用深拷贝与浅拷贝的区别。 先看程序 #include<iostream.h> #include<string.h> class ...
关键词:c语言C++浅拷贝与深拷贝 1/2 相关文档推荐 深拷贝与浅拷贝 5页 ... 登录百度文库,专享文档复制特权,财富值每天免费拿!现在就登录>> 你可能喜欢...
C++拷贝构造函数(深拷贝浅拷贝)_计算机软件及应用_IT/计算机_专业资料。C++...(const CExample& C) { a=C.a; } void Show () { cout<<a<<endl; ...
深拷贝与浅拷贝的区别_IT/计算机_专业资料。5 浅层复制与深层复制 的默认复制规则是浅层复制, 性能好, 1) Java 的默认复制规则是浅层复制, 性能好, 隔离性...
热门文档