operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator和运算符整体上视为一个函数名。
使用操作符重载的意义:
比较基本类型我们可以使用"==",">=","<="等方式判断大小,是否相等等等,但是如果用户想要比较自己定义的类就需要重载操作符(修改原有操作符,自定义一个操作符,所以称之为重载)
以下操作符不可重载:
· 成员选择符
·* 成员对象选择符
:: 作用域解析操作符
?: 条件操作符
sizeof
除了赋值符号外,基类中被重载的操作符都将被派生类继承。
1.重载操作符
在日常编码中operator关键字最常见的使用方式就是用它来重载操作符下面直接上例子:
class persion
{
public:
int age;
bool sex;
persion(int a,bool s):age(a),sex(s){}
bool operator==(persion &p1)
{
if(p1.age==age)
return true;
return false;
}
};
int main(int argc, char *argv[])
{
persion a(1,true);
persion b(1,false);
if(a==b)
{
printf("***********\n");
}else
{
printf("___________\n");
}
}
上面代码输出为***********,可以看出类的==被我们重载了之比较age成员相等即可。在现实写代码也常常会遇到类似问题,比如我们对这个类排序(或者说比较)之比较其中一个成员的大小就行,那么我们就可以通过重载操作符实现该功能。
2.操作隐式转换
下面代码只是简单的说明了operator可以重载隐式转换并没有实现什么具体内容
class persion
{
public:
explicit persion(int a):a(a)
{
printf("*************\n");
}
operator int()
{
printf("int\n");
}
operator float()
{
printf("float\n");
}
int a;
};
int main(int argc, char *argv[])
{
persion a(1);
int b=a;
float c =a;
}
输出为:
int
float
由上面输出可以看出在执行int b=a;时将对象a强转成了int执行了operator int();执行 float c =a;时将对象a强转成了float执行了operator float()。不止可以对基本类型进行强制转换对类也可以进行强转。要活学活用。
3.函数对象
当有类使用operator重载()运算符时,调用该类的对象操作类似操作普通函数,因此取名函数对象。下面直接上代码:
class ClassA
{
public:
ClassA()
{
a=0;
qDebug()<<"ClassA"<<a;
}
int operator()(int a)
{
this->a=a;
qDebug()<<"operator"<<this->a;
return this->a;
}
private:
int a;
};
int main(int argc, char *argv[])
{
ClassA a;
ClassA *b=new ClassA();
qDebug()<<a(10);
qDebug()<<(*b)(20);
}
输出:
ClassA 0
ClassA 0
operator 10
10
operator 20
20
调用对象a(10)特别像调用一个函数,函数对象可以设置参数和返回值,如果对象是指针也可以使用