重载



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值