最近看了操作符重载,《C++ primer》中提到许多,但是我看完之后没啥特别的印象,所以整理一下。
1 不能重载的操作符 :: * ?:
2重载操作符必须具有一个类类型的操作数
3优先级及结合性是固定的
4作为类成员的重载函数,其形参比操作数少1,是因为有一个隐含的this参,限定为第一个操作数
5当重载函数作为非成员函数,但是访问了类的私有成员,则将其定义为该类的友元函数,这其实对其他的也是使用的
6IO操作符重载必须成为非成员函数
7赋值操作符必须成为成员函数,下标操作符也是一样
8重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。
9如果返回的是全新的一个值,一个空间,比如+,那么返回类型可以使用类类型,如果返回的是原先已有的空间,比如=号的重载,最好使用的就是类类型的引用。
10通过重载定义函数对象,所谓函数对象,就是可以直接使用对象,实现函数调用等效果,用在标准库中比较多。其实就是重载操作符为(),这个重载函数的参数就是这个函数对象的参数
11函数适配器,用于扩展一元和二元的函数对象,有两类适配器:(1)绑定器 将一个操作数绑定到给定值而将二元对象转换为一元函数对象如 count_if(vec.begin,vec.end,bind2nd(less_equal<int>(),10)) bind1st将定值绑定到二元函数对象的第一个对象(2)求反器 将谓词函数对象的真值求反。not1 not2 ,not1将一元函数对象求反。比如:count_if(vec.begin,vec.end,not1(bind2nd(less_equal<int>(),10)))
下面是一些测试的代码,就不解释了,运行一下就知道了。
class A {
friend A operator -(A &b,A& c);
public:
int a;
int operator +(A & aa){
return a+aa.a;
}
bool operator()(A & bb){
return a>bb.a;
}
};
#include"test.h"
#include<iostream>
using namespace std;
A operator -(A & b,A & c){
b.a= b.a-c.a;
return b;
}
void main(){
A r;
r.a=3;
A g;
g.a=2;
cout<<(r+g)<<endl;
cout<<(r-g).a<<endl;
cout<<(r+g)<<endl;
cout<<r(g)<<endl;
}