- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C中赋值运算符重载.
赋值运算符重载
虽然一个对象可以由一个单一的赋值语句赋值给另一个对象,我们
之前提到的,此操作可能只创建一个逻辑复制(即,由一个成员
复印件)。
在一个逻辑复制,在一个对象的成员将该成员的值在其他
对象。如果一个类有一个指针成员,由成员复印件使
指针成员在两个对象指向同一个对象。
有两个问题与此成员对成员的复制:第一,因为指针在两个
对象共享相同的变量,这个变量的变化而变化的对象。在其他
的话,这两个对象都不是独立的。
第二,如果共享变量在堆上,我们不知道谁是负责
释放内存。这记忆是不自由的,也将是免费的两倍,这是不
允许。
当一个类成员是一个指向堆内存,我们通常需要过载
赋值操作符来创建一个物理副本。
实例:
//说明动态内存分配的默认分配的危险。
#include iostream.h
#include string.h
const int MAX_CHAR = 10;
class Account
{
friend ostream operator(ostream os, Account b);public:
Account ( char* name =unknown,
char * mr = Miss, float y=0.0)
{ title= new char[strlen(mr)+1];
strcpy(title,mr);
strcpy(owner, name);
balance = y;
}
void changetitle(char* newname)
{
if( strlen(newname) strlen(title) )
{
char* tmp = title;
title = new char[strlen(newname)+1];
strcpy (title,newname);
delete []tmp;
}
else
{
strcpy (title,newname);
}
}
void changename(char* newname)
{strcpy (owner,newname);}
~Account () {delete [ ] title;}
private:
char * title;
char owner[MAX_CHAR];
float balance;
};
ostream operator (ostream os, Account b)
{
os who: b.title b.owner
how much=b.balance\n;
os endl;
return os;
}
void main(){
Account acc(Lou,Mr, 100);
Account acc1;
cout acc;
cout acc1;
acc1=acc;
cout acc1;
acc1.changename(jean);
cout acc1;
coutacc;
acc1.changetitle(Dr.);
cout acc1;
coutacc;
}
Output
who: Mr Lou how much = 100
who: Miss unknown how much = 0
who: Mr Lou how much = 100
who: Mr Jean how much = 100
who: Mr Lou how much = 100
who: Dr. Jean how much = 100
who: Dr. Lou how much = 100
Then: Run time error: trying to delete same memory twice. If
we delete our destructor, then memory leak. The dynamic
memory is not deleted//运行时错误:试图删除该内存的两倍。如果
我们删除我们的析构函数,然后内存泄漏。动态记忆是不会被删除解决方案:重载赋值运算符来得到一个完全不同的
复制包括其自己的堆内存:
(深拷贝)。
在一个类的赋值操作符重载,我们通常需要做的四件事:
首先,我们要检查一个对象是否是分配给本身。(这是可能的因为
变量可以通过不同的名字来访问)。如果是分配给本身,我们不
要做什么。
如果它不是一个自的任务,我们必须释放堆内存的指针成员
对象的当前点。
然后,我们复制的右边的左边。
最后,我们返回*this便于分配链接。返回类型是一个常数
参考因为我们要返回原对象(参考),我们不希望它
被用作左值(常数)。如果返回值是不固定的,我们可以
这样的表达式(X =?Y)=?Z,这实际上意味着,我们分配的Z值的
返回值(X = Y)。换句话说,我们指定Y?=?X,然后将Z?X再次,
您可能关注的文档
最近下载
- 福彩市场管理员培训.pptx
- 7.2化石能源的合理利用教学设计---2024-2025学年九年级化学人教版(2024)上册.docx
- 35kv电缆头制作监理旁站记录.docx
- Unit 4 Plants around us Part C Make a paper garden(课件)人教PEP版(2024)英语三年级上册.pptx
- 中班综合《有趣的螃蟹》PPT课件.ppt
- 顺丰快递企业运作模式探析论文.pdf VIP
- 幼儿园课件:婴幼儿主被动操(1).ppt
- 《PCB设计与制作》课程标准.doc VIP
- 2020明辉学校开展“读书月系列活动”简讯美篇(可编辑).pdf VIP
- 行车轨道更换施工方案.docx
文档评论(0)