C++ operator关键字浅析

  • Post author:
  • Post category:其他


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)特别像调用一个函数,函数对象可以设置参数和返回值,如果对象是指针也可以使用



版权声明:本文为qq_33865609原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。