一般编译器默认的会给类提供了一个默认的赋值运算符重载函数,而默认的赋值运算符重载函数只是进行了简单的赋值操作。用代码演示如下所示:
#includeiostream#includestringusingnamespacestd;classPerson{public: Person(){ id=0; age=0; } Person(intid,intage){ this-id=id; this-age=age; }public: intid; intage;};voidtest(){ Personp1(10,20); Personp2; p2=p1;//默认的赋值运算符重载函数进行了简单的赋值操作 coutp2.id""p2.ageendl;}intmain(){ test(); system("pause"); returnEXIT_SUCCESS;}
还有一个需要注意的重点或是最易犯错的问题是:如若当类有成员指针时,需要在构造函数中申请堆区空间,在析构函数中释放堆区空间,这样的代码看似没问题,实则就会出现同一块空间被释放2次,就会造成内存泄漏,所以这时候利用重写赋值运算符重载函数也可以解决,当然,谈到了赋值运算符重载,当然用它来讲了。以下是利用重写赋值运算符重载函数的简单代码:
#define_CRT_SECURE_NO_WARNINGS#includeiostream#includestringusingnamespacestd;classPerson{public: //申请堆区空间 Person(constchar*name){ pName=newchar[strlen(name)+1]; strcpy(pName,name); } //拷贝构造函数防止浅拷贝问题 Person(constPersonp){ if(pName!=NULL){ deletepName; pName=NULL; } pName=newchar[strlen(p.pName)+1]; strcpy(pName,p.pName); } //重写赋值运算符重载函数 Personoperator=(constPersonper){ //1.不能确定pName指向的空间是否能装下per中的数据,所以先释放pName指向的空间 if(pName!=NULL){ deletepName; pName=NULL; } //2.申请堆区空间,大小由per决定 pName=newchar[strlen(per.pName)+1]; //3.拷贝数据 strcpy(pName,per.pName); //4.返回对象本身 return*this; } //析构函数 ~Person(){ if(pName!=NULL){ delete[]pName; pName=NULL; } } voidprintPerson(){ cout"Name="pNameendl; }private: char*pName;};voidtest(){ Personp1("小明"); Personp2("小华"); p1.printPerson(); p2.printPerson(); p1=p2; cout"===经过赋值后的数据==="endl; p1.printPerson(); p2.printPerson();}intmain(){ test(); system("pause"); returnEXIT_SUCCESS;}
运行后的结果是:
以上是赋值运算符重载的举的一个小例子,都是c++编程中最基础的知识点,当然运算符重载的知识点还有很多种,比如:加减号运算符,左移右移运算符,前置加加,后置加加,数组下标运算符重载等等,因为时间有限,不作具体一一介绍。
总结:在c++编程的赋值运算符重载函数中,有一个小问题,为什么要返回引用的问题?
voidtest01(){ Personp1("A"); Personp2("B"); Personp3("C"); p1=p2=p3;//p3赋值p2,p2赋值给p1 cout(p2=p3)endl; coutp2endl;}
如果返回的是值,那么p2=p3这个表达式会产生一个新的对象,像这个表达式中:p1=p2=p3,而赋值运算符本来的寓意是p3赋值给p2,p2赋值给p1,也就是说p2=p3这个表达式要返回p2这个对象,所以要返回引用。基础很重要,如果有时间的,可以看一些入门的基础教材,跟着实操起来,进步也会快很多。