只要是用户定义的类或结构,都应能进行赋值运算。
struct S
{
int a;
int b;
} ;
S A,B;
A=B; //正确。
对任何类,象拷贝构造函数一样,C++也默认提供赋值运算符。但要区别拷贝构造函数和赋值运算符。
void fn(MyClass &mc)
{
MyClass newMc=mc; //这是拷贝构造函数
newMc=mc; //这是赋值运算符
}
当拷贝构造函数执行时,newMc对象还不存在,拷贝构造函数起初始化的作用。
当赋值运算符在newMc上执行时,它已经是一个MyClass对象。
在拷贝构造函数中,我们碰到浅拷贝和深拷贝的问题。赋值运算符也同样,什么时候浅拷贝不合适,就应提供成员赋值运算符。
//**********************
//** ch18_7.cpp **
//**********************
#include <string.h> #include <iostream.h>
class Name{ public: Name(){ pName = 0; } Name(char* pn){ copyName(pn); } Name(Name & s){ copyName(s.pName); } ~Name(){ deleteName(); } Name & operator =(Name & s) //赋值运算符
{ deleteName(); copyName(s.pName); return *this; } void display(){ cout << pName << endl; } protected: void copyName(char* pN); void deleteName(); char* pName; };
void Name::copyName(char* pN) { pName = new char[strlen(pN) + 1]; if(pName) strcpy(pName, pN); }
void Name::deleteName() { if(pName){ delete pName; pName = 0; } }
int main() { Name s("claudette"); Name t("temporary"); t.display(); t = s; //赋值
t.display(); }
|
在t=s赋值过程中,通过调用delteName(),原先名字占用的空间还给堆,再另外调用
copyName()从堆中分配新存储区去存储新名字。
而拷贝构造函数不需要调用deleteName(),因为刚创建时,还没有分配存放名字的堆空间。
阅读(3184) | 评论(0) | 转发(0) |