一 什么是转换函数?
在 c++ 编码中,我们可能遇到要将类 A 转为 类 B 的情况,此时就可以定义类 A 的转换函数将其按照一定规则转换为 类 B;
转换函数声明规则如下:
cpp
operator 转换类型() const;
转换函数无返回值,转换类型是一个已定义的类,包括c++基本类型 int、double 等,也包括事先定义过的类。
这里介绍一下隐式转换的知识点:
所谓隐式转换,由编译器私下进行的类型转换,该转换不需要使用者干预。
当一个值拷贝给另外一个兼容类型的值时, 往往会发生自动转换
cpp
int a = 3;
double b = 4.5;
double c = a + b; // a将会被自动转换为double类型,转换的结果和b进行加法操作
二 例子
1. 转换函数
cpp
// fraction.h
class Fraction
{
public:
Fraction(int num, int den = 1):m_numerator(num), m_denominator(den)
{
}
~Fraction(){ }
// 转换函数
operator double() const
{
return (double)m_numerator / m_denominator;
}
private:
int m_numerator; // 分子
int m_denominator; // 分母
};
// main.cpp
#include<iostream>
int main()
{
Fraction f(5, 10);
double re1 = 1 + f; // 编译器编译到这里时,会尝试去寻找编译通过的方法,类的转换函数就是其中一种方法, 当发现 Fraction 没有 operator+(Fraction) 重载函数,但是有转换函数时,编译是可以通过的
std::cout << re1 << std::endl;
return 0;
}
输出:
1.5
2. 隐式转换
cpp
// fraction.h
class Fraction
{
public:
Fraction(int num, int den = 1):m_numerator(num), m_denominator(den)
{
}
~Fraction(){ }
// 自定义 operator + 符合函数
Fraction& operator+(const Fraction& other)
{
this->m_numerator = this->m_numerator * other.m_denominator + other.m_numerator * this->m_denominator;
this->m_denominator = other.m_denominator * this->m_denominator;
return *this;
}
public:
int m_numerator; // 分子
int m_denominator; // 分母
};
// main.cpp
#include<iostream>
int main()
{
Fraction f(5, 10);
Fraction f2 = f + 3; // 编译器利用构造函数 将 3 隐式转换为 Fraction
std::cout << f.m_numerator << ", " << f.m_denominator << std::endl;
return 0;
}
输出:
35, 10
3. 禁用隐式转换
explicit 关键字修饰构造函数后,则禁止编译器私自做隐式转换
cpp
// faraction.h
class Fraction
{
public:
// explicit 关键字修饰构造函数后,禁止编译器私自做隐式转换
explicit Fraction(int num, int den = 1):m_numerator(num), m_denominator(den)
{
}
~Fraction(){ }
Fraction& operator+(const Fraction& other)
{
this->m_numerator = this->m_numerator * other.m_denominator + other.m_numerator * this->m_denominator;
this->m_denominator = other.m_denominator * this->m_denominator;
return *this;
}
public:
int m_numerator; // 分子
int m_denominator; // 分母
};
// main.cpp
#include<iostream>
int main()
{
Fraction f(5, 10);
Fraction f2 = f + 3; // 因为禁用了隐式转换,因此无法编译通过
std::cout << f.m_numerator << ", " << f.m_denominator << std::endl;
return 0;
}