c++ 中 operator 使用小结

来源:互联网 发布:女童白色运动鞋淘宝 编辑:程序博客网 时间:2024/06/07 00:18

1、operator作类的转换函数

类可以使用构造函数将其他类型转化为此类的对象,比如

my_class a = my_class(int i);

将int型转化为my_class类的一个对象。

同样,也可以使用类的转换函数将类的对象转化为其他的类型。
类的转换函数应当满足以下的几个条件:

  • 转换函数必须是类方法
  • 转换函数不能指定返回类型
  • 转换函数不能有参数

    下面是一个类转化函数的例子

#include <iostream>using namespace std;class my_class{public:    operator int()//定义了一个将类转化为int的转换函数    {        cout << "convert_to_int" << endl;        return 1;    }};int main(){    my_class a;    int i_a = (int)a;//第一次显式的转换    cout << a << endl;//第二次隐式的转换    return 0;}

最终的输出结果如下:
结果

当然也可以转化为任意其他的类型,只需要改变转换函数即可。

但是在定义转化函数时,要避免出现二义性,比如不要同时提供多个符合条件的转换函数:

#include <iostream>using namespace std;class my_class{public:    operator double()//定义了一个将类转化为double的转换函数    {        cout << "convert_to_double" << endl;        return 1.1;    }    operator int()//定义了一个将类转化为int的转换函数    {        cout << "convert_to_int" << endl;        return 1;    }};int main(){    my_class a;    cout << a << endl;//报错    return 0;}

在VS上得到如下的报错信息:

有多个运算符 "<<" 与这些操作数匹配

当然,若同时需要这两个转换函数,这个错误也可以通过很多方法来解决,比如显式的指定要输出的是哪种类型,而不是让编译器自己去选择:

cout << (double)a << endl;

或者指定其中一个转换函数只能显式的转换,而不能隐式的转换

explicit operator double(){    cout << "convert_to_double" << endl;    return 1.1;}

都将得到正确的结果。


2、operator在类中重载运算符

重载与类型转换虽然使用的是同一个关键字,但它们在形式上还是有很大的差别的:

  • 类型转换:operator <类型>()
  • 运算符重载:<类型> operator <运算符>(<参数表>)

重载主要有两种形式,成员函数形式与友元函数形式。下面举个例子:

#include <iostream>using namespace std;class MyClass{public:    MyClass() {}    MyClass(int a, double b):a_(a),b_(b){}    ~MyClass(){}    int get_a() { return a_; }    double get_b() { return b_; }    MyClass operator+(const MyClass &adder) const//以成员函数方式重载+    {        MyClass sum;        sum.a_ = a_ + adder.a_;        sum.b_ = b_ + adder.b_;        return sum;    }    friend MyClass operator-(const MyClass &A,const MyClass &B)//以友元方式重载-    {        MyClass diff;        diff.a_ = A.a_ - B.a_;        diff.b_ = A.b_ - B.b_;        return diff;    }private:    int a_;    double b_;};int main(){    MyClass A(1, 1.1);    MyClass B(2, 2.2);    MyClass sum = A + B;    MyClass diff = A - B;    cout << sum.get_a() << "\t" << sum.get_b() << endl;    cout << diff.get_a() << "\t" << diff.get_b() << endl;    return 0;}

程序的运行结果:
这里写图片描述

原创粉丝点击