C++运算符重载(6) 重载转换操作符

来源:互联网 发布:微赞是什么样的软件 编辑:程序博客网 时间:2024/06/06 04:13

类型转换符采用通用形式:

operator /*重载类型*/() {/*内容*/}

对任何可作为函数的返回类型(除了void之外),都可以进行重载

不允许转换为数组或函数类型,转换为指针类型以及引用类型是可以的

operator int(Small Int& ); // error:nonmemberclass SmallInt{public:int operator int(); // error: return listoperator 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类型 再赋给intergeroperator 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容易出错.




原创粉丝点击