C++重载的一些注意事项

一:可以重载的操作符

+ -  * /  %  ^ &  | ~  ! =    >   <    +=    -=     *=   /=      %=    ^=     &=     |=    >>    <<     >>=    <<=    ==    !=     >=    <=   &&    ||   ++   --       ->*    ,   ->    []     ()    new  new[]   delete    delete[]

不能重载的操作符 ::  .    .*     ?:     

提示:

如果把运算符作为成员函数重载,那么类对象必须出现在运算符的左边。

1.一元操作符可以是不带参数的成员函数或带一个参数的非成员函数。

2.二元操作符可以是带一个参数的成员函数或带两个参数的非成员函数。

3.operator=、operator[]、operator()、operator->只能定义为成员函数。(这里其实调用赋值运算符时候是隐式绑定了一个*this来操作,同时,如果声明为友元,那么参数为两个,如果第一个参数是数,那么会导致 int 1=xxx,实际上,这样的情况是不允许的。)

 

4.operator->的返回值必须是一个指针或能使用->的对象。

5.重载 operator++ 和 operator-- 时带一个 int 参数表示后缀,不带参数表示前缀。

二、使用重载 

1.只将会改变第一个参数的值的操作符(如: +=)定义为成员函数而将返回一个新对象的操作符(如: +)定义为非成员函数(并使用 += 来实现)。    

2.只有非成员函数才能在左参数上实施性别转换如果需要进行转换则应将操作符定义为非成员函数。 

3.对一元操作符, 为避免隐式转换最好将其重载为成员函数。同时友元破坏了类的封装,因此要尽量避免使用友元函数和友元类。

4.对二元操作符, 为能在左操作数上能进行和右操作数一样的隐式转换, 最好将其重载为非成员函数,还有 比如像+这样的重载 1+obj 和obj+1就比较方便,但是要注意一点,

mycalss operator+(myclass obj,int b),只能使用 obj+b;如果要使用b+obj还需要重载一个mycalss operator+(int b,myclass obj).

5.operator>>、operator<< 应定义为非成员函数。(这是由于操作符的左边不是该类的对象)

6.重载 operator[] 之类的操作符, 应尽量提供 const 版本和非 const 版本。    

7.建议 所有一元操作符成员= () [] ->必须为成员

+= -= /= *= ^= &= != %= >>= <<=成员

其它二元操作符非成员

8 类型转换符 没有返回类型,返回类型就是函数名。但是要有 返回值

例如

operator int()
{
 return 0XFFFF;
}

表示把该类转换为int时 返回 0XFFF;

int a=obj;  =>  a=0xfff;

 

对于重载箭头


重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。

如果返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并从结果对象获取指定成员。如果被指向的类型没有定义那个成员,则编译器产生一个错误。
如果返回类型是类类型的其他对象(或是这种对象的引用),则将递归应用该操作符。

编译器检查返回对象所属类型是否具有成员箭头,如果有,就应用那个操作符;否则,编译器产生一个错误。这个过程继续下去,直到返回一个指向带有指定成员的的对象的指针,或者返回某些其他值,在后一种情况下,代码出错。

三: 返回类对象 还是返回对象的引用??

 

1 如果需要作为表达式的左值,那么就要返回对象的引用。以便可使用连续的调用 ,比如  cout<<"string1"<<"string2";这样为了连续调用,类似的还有+= -= >> [] ()。

2+ - * /这一类应当返回类的对象,而不是返回引用。比如一条语句 obj1+obj2 没有赋值给另外的对象,obj1 obj2是肯定不会被修改的。如果返回对象的引用,不管是返回obj1还是obj2的引用,都能使返回值作为左值,导致出现可以 obj1+obj2=xxx的情况发生,这是不允许的,同时也不能返回局部对象的引用。所以这里应当返回对象,这个返回的对象使用的拷贝构造函数,应当在类里面提供。

posted @ 2012-10-22 17:48  IamHuskar  阅读(291)  评论(0编辑  收藏  举报