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

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

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容易出错.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值