深拷贝与浅拷贝
来源:互联网 发布:采购部数据流程图例题 编辑:程序博客网 时间:2024/05/08 16:00
(1)建立一个新对象,并用另一个同类的已有对象对新对象进行初始化,例如:
- class
Rect - {
- private:
-
int width; -
int height; - };
-
- Rect
rect1; - Rect
rect2(rect1); // 使用rect1初始化rect2,此时会进行对象的复制
- void
fun1(Rect rect) - {
-
... - }
-
- int
main() - {
-
Rect rect1; -
fun1(rect1); // 此时会进行对象的复制 -
return 0; - }
- Rect
fun2() - {
-
Rect rect; -
return rect; - }
-
- int
main() - {
-
Rect rect1; -
rect1=fun2(); -
// 在fun2返回对象时,会执行对象复制,复制出一临时对象, -
// 然后将此临时对象“赋值”给rect1 -
return 0; - }
对象的复制都是通过一种特殊的构造函数来完成的,这种特殊的构造函数就是拷贝构造函数(copy constructor,也叫复制构造函数)。拷贝构造函数在大多数情况下都很简单,甚至在我们都不知道它存在的情况下也能很好发挥作用,但是在一些特殊情况下,特别是在对象里有动态成员的时候,就需要我们特别小心地处理拷贝构造函数了。下面我们就来看看拷贝构造函数的使用。
- Rect::Rect(const
Rect& r) - {
-
width = r.width; -
height = r.height; - }
- class
Rect - {
- public:
-
Rect() // 构造函数,计数器加1 -
{ -
count++; -
} -
~Rect() // 析构函数,计数器减1 -
{ -
count--; -
} -
static int getCount() //返回计数器的值 -
{ -
return count; -
} - private:
-
int width; -
int height; -
static int count; //一静态成员做为计数器 - };
-
- int
Rect::count //= 0; 初始化计数器 -
- int
main() - {
-
Rect rect1; -
cout<<"The count <<Rect::getCount()<<endl;of Rect: " -
Rect rect2(rect1); // 使用rect1复制rect2,此时应该有两个对象 -
cout<<"The count <<Rect::getCount()<<endl;of Rect: " -
return 0; - }
- class
Rect - {
- public:
-
Rect() // 构造函数,计数器加1 -
{ -
count++; -
} -
Rect(const Rect& //r) 拷贝构造函数 -
{ -
width = r.width; -
height = r.height; -
count++; // 计数器加1 -
} -
~Rect() // 析构函数,计数器减1 -
{ -
count--; -
} -
static int getCount() //返回计数器的值 -
{ -
return count; -
} - private:
-
int width; -
int height; -
static int count; //一静态成员做为计数器 - };
- class
Rect - {
- public:
-
Rect() // 构造函数,p指向堆中分配的一空间 -
{ -
p = new int(100); -
} -
~Rect() // 析构函数,释放动态分配的空间 -
{ -
if(p != NULL) -
{ -
delete p; -
} -
} - private:
-
int width; -
int height; -
int *p; //一指针成员 - };
-
- int
main() - {
-
Rect rect1; -
Rect rect2(rect1); // 复制对象 -
return 0; - }
- class
Rect - {
- public:
-
Rect() // 构造函数,p指向堆中分配的一空间 -
{ -
p = new int(100); -
} -
Rect(const Rect& r) -
{ -
width = r.width; -
height = r.height; -
p = new int; 为新对象重新动态分配空间 -
*p = *(r.p); -
} -
~Rect() // 析构函数,释放动态分配的空间 -
{ -
if(p != NULL) -
{ -
delete p; -
} -
} - private:
-
int width; -
int height; -
int *p; //一指针成员 - };
此时rect1的p和rect2的p各自指向一段内存空间,但它们指向的空间具有相同的内容,这就是所谓的“深拷贝”。
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 03Android学习从零单排之Service
- Linux,ubuntu 格式化移动硬盘
- Hibernate学习篇12——session方法之save与update
- 使用struts2自定义拦截器,要引入defaultStack
- Handler消息机制之基础代码运用篇
- 深拷贝与浅拷贝
- 位域与大小端
- Activity 【生命周期】
- Mina二进制传输对象IoBuffer的使用
- UESTC 1143 传输数据 网络流 最大流 Dinic
- 操作系统常见面试题总结
- Handler消息机制之基础代码运用篇(2)
- ${pageContext.request.contextPath} JSP取得绝对路径
- Android Emoji表情开发。两端使同一套的图片,防止两端因为系统内置的Emoji表情不一样,而造成用户体验不一致!