1、重载比较运算符
若重载运算符函数左边的实参是double类型,如bool operator >(const double & value, const CBox & aBox);
则不能以类的成员函数形式实现该运算符
因为类成员运算符函数总是以左边的实参作为this指针
而只有类的成员函数才有thIs 指针
且要注意该函数的成名和定义要跟在类定义后面,因为其形参要引用CBox 对象
2、重载赋值运算符
默认版本的赋值运算符只提供逐个成员的复制过程,一半情况下使用默认赋值运算符没有问题,但是另一半情况下,即如果类中动态给成员分配空间的话,比如之前的CMessage类中有一个指向字符串的指针pmessage的话,这时若是motto2=motto1 使用默认赋值运算符的话,两个对象指向相同字符串,修改一个就会影响另一个,并且销毁motto1时,其析构函数就释放该字符串占用的内存,motto2的pmessage将指向可能已经被其他对象占用的内存,发生问题,因此这时需要自己定义赋值运算符函数:
CMessage & operator =(const CMessage &aMess)
// 该函数有返回的原因在于:有时会出现mott1=motto2=motto3这种情况,这时需要(mott2=mott3)有返回,这时返回 // CMessage和CMessage&都是可以的,但是有的时候会出现(mott1=motto2)=mott3,这时就一定需要返回 // // CMessage&,因为若只返回CMessage,那么返回的则是原始对象的临时副本,编译器是不允许临时对象调用成员函数的
{
if(this==&aMess)
return *this; //这句是为了防止将一个指向motto1的指针指向的东西赋值给mott01,直观上说就是motto1=motto1,因为这时,
//执行后面的delete[]pmessage会出问题
delete[] pmessage;
pmessag=new char[strlen(aMess.pmessage)+1]
strcpy_s(this->pmessage,strlen(aMess.pmessage)+1,aMess.pmessage);//这两句与之前的复制构造函数其实是一样的过程
return *this;
}
注:
char * pmessage='' i love you' ; i love you 是字符串常量(编译时就确定),存放在静态存储区,只能通过指针访问,而不能改变。慢。
char pmessage[20]='i love you '; 存储在 栈(运行时才确定),可以访问,可以修改。快。
按内存分配分,除了上述静态存储区(存静态数据,全局数据,常量),栈(存一般的变量,不需自己回收),还有堆(动态分配的,需要自己回收)。
参考http://www.cnblogs.com/kaituorensheng/archive/2012/10/23/2736069.html