类型转换符采用通用形式:
operator /*重载类型*/() {
/*内容*/
}
对任何可作为函数的返回类型(除了void之外),都可以进行重载
不允许转换为数组或函数类型,转换为指针类型以及引用类型是可以的
operator int(Small Int& ); // error:nonmember
class SmallInt
{
public:
int operator int(); // error: return list
operator int(int = 0); // error:parameter list
// ...
};
这个例子中有三个错误
(1)转换函数必须为成员函数
(2)类型转换不能有形参
(3)类型转换不能有返回值
虽然转换函数不能指定返回的类型,但是每个转换函数必须显示地返回一个指定的值
比如operator int() 返回int类型的值, operator sales_item() 返回sales_item类型的值
转换操作符的使用:
class Interger {
private:
int data;
public:
Interger(int v) {
data = v;
}
重载赋值操作符 可以实现把int类型赋值赋给interger类型
Interger& operator = (const int& v) {
data = v;
return *this; //返回Interger对象
}
//类型转换操作符:在把interger类型赋值给int类型时 先会隐式地把interger类型转为int类型 再赋给interger
operator int() {
return data;
}
//取数据
int getData() {
return data;
}
};
重载=: 可以实现(interger) a = (int) b
重载转换符int: 当(int) b = (interger) a 时, 先会把赋值符右边的a从interger转为int,再把a赋值给b
重载int就实现了两个变量之间的赋值
int main() {
int a = 0;
Interger b(10);
b = a;
cout << b.getData() << endl;
system("PAUSE");
return 0;
}
再来看一个特殊的例子:
#include <iostream>
#include <cmath>
using namespace std;
class Complex
{
private:
double real;
double imag;
public:
// 默认构造函数
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i)
{}
// 求复数的绝对值
double mag()
{
return getMag();
}
// 转换操作符
operator double ()
{
return getMag();
}
private:
// get magnitude
double getMag()
{
return sqrt(real * real + imag * imag);
}
};
int main()
{
// 定义一个复数对象
Complex com(3.0, 4.0);
// 打印magnitude,可以使用下面的两种方法
//方法1
cout << com.mag() << endl;
//方法2
cout << com << endl;
}
这里的方法2为什么也会显示和方法1一样的内容呢
com是一个Complex类型, cout<<com<<endl是不被允许的
但重载转换操作符double后 com会先从Complex型转为double类型 再被输出流输出
但是应该避免方法2,方法2容易出错.