在 C++ 中,類型的名字(包括類的名字)本身也是一種運算符,即類型強制轉換運算符。
類型強制轉換運算符是單目運算符,也可以被重載,但只能重載為成員函數,不能重載為全局函數。經過適當重載后,(類型名)對象
這個對對象進行強制類型轉換的表達式就等價於對象.operator 類型名()
,即變成對運算符函數的調用。
下面的程序對 double 類型強制轉換運算符進行了重載。
#include <iostream> using namespace std; class Complex { double real, imag; public: Complex(double r = 0, double i = 0) :real(r), imag(i) {}; operator double() { return real; } //重載強制類型轉換運算符 double }; int main() { Complex c(1.2, 3.4); cout << (double)c << endl; //輸出 1.2 double n = 2 + c; //等價於 double n = 2 + c. operator double() cout << n; //輸出 3.2 }
程序的輸出結果是:
1.2
3.2
第 8 行對 double 運算符進行了重載。重載強制類型轉換運算符時,不需要指定返回值類型,因為返回值類型是確定的,就是運算符本身代表的類型,在這里就是 double。
重載后的效果是,第 13 行的(double)c
等價於c.operator double()
。
有了對 double 運算符的重載,在本該出現 double 類型的變量或常量的地方,如果出現了一個 Complex 類型的對象,那么該對象的 operator double 成員函數就會被調用,然后取其返回值使用。
例如第 14 行,編譯器認為本行中c
這個位置如果出現的是 double 類型的數據,就能夠解釋得通,而 Complex 類正好重載了 double 運算符,因而本行就等價於:
double n = 2 + c.operator double();