zoukankan
html css js c++ java
构造函数与拷贝解析
当我们声明一个类的时候,可能会需要另外一个类的实体去初始化一个新定义的类。
//
类定义
//
此类只能实现数据的拷贝,而不能够对资源进行操作。
class
ScreenOnlyCopyData
...
{
public
:
short
height()
...
{
/**/
/*
...
*/
}
short
weight()
...
{
/**/
/*
...
*/
}
string
screen()
...
{
/**/
/*
...
*/
}
private
:
string
_screen;
string
::size_type _cursor;
short
_height,_weight;
}
;
//
当有一个类对象实现时,
ScreenOnlyCopyData s1;
//
对s1进行操作.....
ScreenOnlyCopyData s2
=
s1;
//
等同于下面的语句
s2._screen
=
s1._screen;
s2._cursor
=
s1._cursor;
s2._height
=
s1._height;
s2._weight
=
s1._weight;
//
所以,当我们定义了一个带有资源分配的类类型时,在类之间相互拷贝必须重新构造拷贝构造函数,
//
否则将只对值进行简单的赋值过程,最终导致两个类对象指向同一个资源,在其中一个对象将
//
资源析构时,另一个对象原本指向资源的指针将指向一个未定义的资源,从而导致错误的发生。
//
具体见下面的代码,为使分析简单,仅使用两个成员。
Class NoResourceToCopy
...
{
public
:
NewResource(size_type len)
...
{
*
p
=
new
int
[len];}
~
NoResourceToCopy()
...
{delete []p;}
private
:
int
*
p;
int
s;
}
;
NoResourceToCopy nr1;
nr1.NewResource(
10
);
NoResourceToCopy nr2
=
nr1;
//
特殊语句1
//
按上面的解释,这特殊语句1应该等同于下面的语句的集合
//
nr2.p=nr1.p;
//
nr2.s=nr2.s;
//
所以,当nr1析构时,nr2中的p指向的内存块是不明确的,因此会出现错误。
//
因此为使特殊语句1能够成功获取资源,需要如下的定义。
Class RecourseToCopy
...
{
public
:
RecourseToCopy()
...
{}
ResourceToCopy( ResourceToCopy
&
)
...
{}
~
RecourseToCopy()
...
{}
private
:
int
*
p;
int
len;
}
;
RecourseToCopy::ResouceToCopy()
...
{
*
p
=
NULL:
len
=
0
;
}
ResourceToCopy::ResourceToCopy(ResourceToCopy
&
s)
...
{
if
(NULL
==
s.p)
...
{
this
->
p
=
NULL;
this
->
len
=
0
;
}
this
->
p
=
new
int
[s1.len];
//
只有在此处再次申请资源,才能保证s1被解析时,p不是野指针。
this
->
len
=
s1.len;
}
ResourceToCopy ::
~
ResouceToCopy()
...
{
delete []p;
}
/*
*
* Copyright (c) 2011 Ubunoon.
* All rights reserved.
*
* email: netubu#gmail.com replace '#' to '@'
* http://www.cnblogs.com/ubunoon
* 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
* 推荐不错的珍珠饰品,欢迎订购 *
宜臣珍珠(淡水好珍珠)
*/
查看全文
相关阅读:
mysql DCL(数据控制语句)
sybase 脚本建表和删除表
mysql DML(数据操纵语句)
delphi fastmm4 调试
delphi class of 类引用
DELPHI SetLocaleInfo 设置本地时间
DELPHI 去字符串中所有空格
SUSE 11 安装MongoDB
suse下 登录mongodb
DELPHI 的 {$M +} 和{$M -}
原文地址:https://www.cnblogs.com/ubunoon/p/2058945.html
最新文章
Android源码编译
(转)C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)
(转)数据库模型设计——历史与版本设计
(转)Web2.0 大型互联网站点的架构
(转)Flickr架构
(转)如何在高并发分布式系统中生成全局唯一Id
(转)SqlServer数据库大型应用解决方案总结
(转)Ehcache作为分布式缓存的研究
(转)深入探讨在集群环境中使用 EhCache 缓存系统
Amoeba For MySQL入门:实现数据库水平切分
热门文章
Amoeba相关产品及其介绍
淘宝要提出「双飞翼」布局
校招的常考算法类型以及对应的典型题目
学习nginx从入门到实践(五) 场景实践之静态资源web服务
学习nginx从入门到实践(四) 基础知识之nginx基本配置语法
【PHP】如何将SESSION数据存放到Redis中
php实现登录失败次数限制
thinkphp5集成GatewayWorker
基于数据的访问控制 --- 服务器端
辗转相除法 --- 求出两个整数的最大公约数
Copyright © 2011-2022 走看看