C++自定义类型的转换函数

operator关键字

C++中的关键字operator有两种用法,其中用于运算符重载应该是最为大家所熟知的,另一种用法就是用作类的转换函数,这篇文件就记录一下第二种用法。

通常我们在编程的时候会做一些类型转换,就像下面这样:

1
2
double a = 2.22;
int b = int(a);

其实除了内置的类型能够进行转换,自己定义的类也能实现类型转换。

operator作类的转换函数

直接看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

class A {
public:
A(int i) {
i_ = i;
}

operator int() const {
std::cout << "HHH" << std::endl;
return i_;
}

private:
int i_;
};

int main(int argc, char** argv) {
A a(5);
int aa = int(a);
std::cout << a << std::endl;
system("pause");
return 0;
}

上面的例子就定义了一个类,类中再定义了它自己的一个转换函数,转换成int 类型,用法很简单,看代码应该就很明白。

关键点

用operator作转换函数需要注意几点:

  1. 转换函数必须是类方法;
  2. 转换函数没有返回值;
  3. 转换函数没有参数。

当然转换函数并不是能转换成任意类型,这些类型必须都是内置的类型。

在某些情况下,C++会出现隐式的转换,比如说对于上面的类,有如下代码:

1
2
A a(10);
std::cout << a << std::endl;

我们没有重载<<,编译器就会隐式将a转换成int类型,然后输出。如果不希望出现隐式转换,可以在转换函数前加上explicit:

1
2
3
4
explicit operator int() const {
std::cout << "HHH" << std::endl;
return i_;
}