# C++转换函数

2017-01-06 07:57:40来源:CSDN作者:lihao21人点击

## 一、conversion function, 转换函数

### 1. 特点

`operator type()`

### 2. 例子

``class Fraction {public:    Fraction(int num, int den) :        m_numerator(num), m_denominator(den) {}    operator double() const {        return (double) (m_numerator / m_denominator);    }private:    int m_numerator;  // 分子    int m_denominator;  // 分母};Fraction f(3, 5);double d = 4 + f;  // 调用operater double将f转换成double``

### 3. 说明

`double d = 4 + f;`这一语句会首先查找Fraction是否有重载操作符 operator + (double, Fraction) 的函数，由于没有，所以调用会转换函数`operator double() const`

## 二、non-explicit-one-argument constructor

### 1. 例子

``class Fraction {    Fraction(int num, int den=1) :        m_numerator(num), m_denominator(den) {}    Fraction operator + (const Fraction& f) {        return Fraction(...);    }private:    int m_numerator;  // 分子    int m_denominator;  // 分母};Fraction f(3, 5);Fraction d2 = f + 4;  // 调用non-explicit ctor将4转换成Fraction(4, 1)，然后再调用operator +``

## 三、conversion function vs. non-explicit-one-argument constructor

### 1. 例子

``class Fraction {    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_numerator;  // 分子    int m_denominator;  // 分母};Fraction f(3, 5);Fraction d2 = f + 4;  // [Error] ambiguous``

### 2. 说明

- 可以将4转换成Fraction
- 可以将f转换成double，与4相加得到一个double，然后再转换成Fraction

## 四、explicit-one-argument constructor

### 1. 例子

``class Fraction {    explicit 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_numerator;  // 分子    int m_denominator;  // 分母};Fraction f(3, 5);Fraction d2 = f + 4;  // [Error] convertion from double to Fraction requested``

### 3. 作用

explicit这个关键字基本只出现在构造函数前面，意思是需要明确地需要调用这个构造函数才能调用，不存在暗中、自动的转换操作。

## 五、转换函数在STL中的运用

### 1. 例子

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

### 2. 说明

`class vector <bool, Alloc>`这里是模板的偏特化。

`reference operator[] (size_type n)`返回vector元素的类型，从vector类型的声明看，应该是返回 一个bool类型的值，可是现在却返回了一个referecnce类型。
reference类型亦即__bit_reference类型，故__bit_reference类型需要转换成bool类型。

## 参考资料

1. 侯捷《C++最佳编程实践》视频，极客班，2015
2. 《C++ Primer》中文版，第三版，潘爱民等译，2002