C++重载转型操作符

前面我们已经介绍过转型构造函数,转型构造函数可以将其它类型的参数转换为类类型。如果我们要进行相反的转换过程,将类类型转换为其它数据类型,则需重载转型操作符。

转型操作符重载函数的声明语法如下:

operator 类型名 ();

转型操作符重载函数有几点需要注意的:
  • 函数没有返回类型;
  • 虽然没有返回类型但是函数体中必须有return语句,其返回类型是由类型名来指定的;
  • 转型操作符重载函数只能以类的成员函数的形式进行重载,而不能以友元函数或顶层函数的形式进行重载。

举个例子:
#include <iostream>
using namespace std;

class clock
{
public:
    clock(){hour = min = ap = 0;}
    clock(int h, int m, int ap);
    operator int();
private:
    int hour;
    int min;
    int ap;  // 0表示am, 1表示pm
};

clock::clock(int h, int m, int ap)
{
    hour = h;
    min = m;
    this->ap = ap;
}

//转型操作符重载函数
clock::operator int()
{
    int time = hour;
    if(time == 12)
        time = 0;
    if(ap == 1)
        time += 12;
    time *= 100;
    time += min;
    return time;
}

int main()
{
    clock c(5,7,1);
    int time = c;
    cout<<time<<endl;
    return 0;
}
在本例中我们重载了一个 clock 时钟类,类中声明了一个转型操作符重载函数,该函数可以将类类型的时间转换为一个整形,转换后的整数是军事时间。

在主函数中,我们定义了一个 clock 类的对象 c,之后将其赋给一个整形变量 time,因为我们定义了转型操作符重载函数,因此这一句话并没有出现语法错误。

转型操作符重载可以给程序带来一定的方便,但是建议还是谨慎使用。因为系统通常在需要的时候就会调用转型操作符重载函数,该函数的调用时隐式的,有时候会给程序带来一些意想不到的问题。