文档详情

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

发布:2016-08-12约3.99千字共5页下载文档
文本预览下载声明
赋值运算符重载 虽然一个对象可以由一个单一的赋值语句赋值给另一个对象,我们 之前提到的,此操作可能只创建一个逻辑复制(即,由一个成员 复印件)。 在一个逻辑复制,在一个对象的成员将该成员的值在其他 对象。如果一个类有一个指针成员,由成员复印件使 指针成员在两个对象指向同一个对象。 有两个问题与此成员对成员的复制:第一,因为指针在两个 对象共享相同的变量,这个变量的变化而变化的对象。在其他 的话,这两个对象都不是独立的。 第二,如果共享变量在堆上,我们不知道谁是负责 释放内存。这记忆是不自由的,也将是免费的两倍,这是不 允许。 当一个类成员是一个指向堆内存,我们通常需要过载 赋值操作符来创建一个物理副本。 实例: //说明动态内存分配的默认分配的危险。 #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再次,
显示全部
相似文档