C++中赋值运算符重载..doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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再次,

文档评论(0)

dashewan + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档