C++重载操作符实用经验

文章内容均整理自    刘光《C++程序员不可不知的101条实用经验》

1.有重载&&、||和,操作符想到的
小心陷阱:
(1)不要重载&&和||运算符。因为重载&&和||,会导致&&和||失去简短求值功能。这是我们不愿看到,同时也存在风险
(2)同样不要重载,和()
操作符重载规则
(1)类的设计者不能声明一个没有预定义的重载操作符
(2)不能为内置数据类型定义其他的操作符
(3)预定义的操作符优先级不能改变
(4)当一个重载操作符是一个名字空间的函数时,对于操作符的第一个和第二个参数,即等于操作符左和右两个操作数,都会考虑转换
操作符声明为类成员还是名字空间成员?
如果一个重载操作符是类成员,那么只有当和它一起被使用的做操作数是该类的对象时,它才会被调用。如果该操作符的左操作数必须是其他的类型,那么重载操作符必须是名字空间成员
注意:C++要求 赋值=,下标[],调用()和成员访问箭头->操作符必须被定义为 类成员操作符

2.区别++/--操作符前置和后置差异
①重载前置操作符:
CHAR & operator++ ()
{
        (*this) += 1;
        return *this;
}
②重载后置操作符:
const CHAR operator-- (int)
{
        CHAR value = *this;
        ++(*this);
        return value;
}
重载前置和后置操作符的区别:
(1)返回类型不同
前置++返回类型是CHAR &,是一个右值,后置++返回的是const CHAR,是一个左值
注意:
(1)后置运算符如果不是const对象,a(++)++这样的表达式就可以通过编译。内置类型中,(i++)++是不能编译通过的,因为后置运算符反悔的是一个左值,不能进行++操作。
(2)前置运算符返回引用是为了与内置类型的行为保持一致,返回的总是被自增的对象本身。
(2)形参的区别
前置++没有形参,后置++有形参int,但实际上也没被用到,这样做是为了防止函数重复声明问题
(3)代码实现的区别
前置++的实现比较简单,自增之后,将*this返回即可。后置++需要返回自增之前的对象,所以先将对象拷贝一份,在进行自增,最后返回那个拷贝
(4)效率的区别
如果不需要返回自增之前的值,那么前置++和后置++的计算效果都一样,但建议优先使用前置++,因为后置++会生成临时对象

3.重载operator[]的注意事项
请谨记:
(1)请注意operator[]下标操作符只能作为类的成员函数,定义时要定义两个版本,以适应const对象和非const对象


4.重载operator=的陷阱
①谨慎使用编译产生的operator=
有编译器产生的operator=只是简单地将元对象位于栈中的内容按位拷贝并复制给新对象,而不考虑位于堆上的数据(浅拷贝和深拷贝问题)
②小心自赋值陷阱
③operator=需返回*this的引用
当定义自己的赋值运算符时,必须返回赋值运算符左边参数的引用,*this。如果不这样做,就会导致不能连续赋值,或导致调用时的隐式转换不能进行,或两种情况同时发生。
④operator=中对所有成员进行赋值
⑤关于赋值运算符的继承

5.重载操作符,类成员函数还是友元函数
注意:
(1)一般作为类的成员函数,其形参操作数看起来比操作数目少1。因为作为成员函数的操作符存在一个隐含的this形参,限定为第一个操作数
(2)重载一元操作符,如果作为成员函数就没有形参,最为友元函数就有一个形参
(3) 重载二元操作符,如果作为成员函数就有一个形参,最为友元函数就有两个形参
(4)一般将关系和算术操作符声明为friend函数,将赋值操作符定义为成员函数
请谨记:
(1)一般来说,对于双目运算符,最好的重载方案是采用友元函数,对于单目运算符,最好的重载方案是采用成员函数
(2)特殊情况:双目运算符=只能选择成员函数,单目运算符()、[]、->只能重载为成员函数。由于<<第一个操作数只能为ostream类型,所以此运算符只能重载为友元函数

猜你喜欢

转载自blog.csdn.net/sinat_39061823/article/details/80569407