C++【侯捷】——— 转换函数

C++【侯捷】——— 转换函数

两个方向的转换

设计一个分数的类,就是分子除以分母,返回的是double类型。所以在这个类的调用地方转换成double类型。

class Fraction
{
public :
  Fraction(int num, int den=1)
       : m_numerator(num), m_denominator(den) { }
  operator double() const {
      return (double) (m_numerator/m_denominator);
  Fraction operator+(const Fraction& f) {
      return Fraction(......);
  }
private:
  int m_denominator;
  int m_numerator;
}
Fraction f(3,5);
double d=4+f;

这里面重点是operator的函数,返回类型不用写。
总结下:
1、没有返回值,返回类型在重载的名称中
2、没有参数
3、是const的,分子和分母是不变的
在使用的时候,编译器先找+号的重载函数,如果有重载的+第一个参数是int或float,第二个是Fraction。如果没有,再看能不能将f转换成double类型。
转换函数可以写多个,也不一定是基本类型,根据需要来定义。
对于有operator+的时候:
Fraction d2=f+4;
编译器会先找operator+,找到了,但是参数不配,编译器会将4转换成Fraction类型。
如果double()和operator+都有,连个都可以,编译器不知道该走哪个会报错ambiguous。

explicit

当构造函数前面加上expilcit就是告诉编译器,不要进行类型转换,要按照类的设计进行,这样d2=f+4 就不能转过去了。编译器会报错:conversion from ‘double’ to ‘Fraction’ requestion。
这个关键字大多是用在构造函数的前面。

 explicit Fraction(int num, int den=1)
       : m_numerator(num), m_denominator(den) { }

标准库中的转换代码:

template<class Alloc>
class vector<bool, Alloc>
{
public:
  typedef __bit_reference reference;
protected:
  reference operator[](size_type n) {
    return *(begin() + difference_type(n));
  }
 ...
 
struct __bit_reference {
  unsigned int* p;
  unsigned int mask;
  ...
public:
  operator bool() const {return !(!(*p&mask));
  ...

这个设计手法叫做:代理,是一种设计模式,本来应该operator[]传回的是bool,但是返回的是reference.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值