青海 网站开发 图灵,如何创建自己的网页,大连网站建设 选领超科技,哪里找免费网站一 什么是转换函数#xff1f; 在 c 编码中#xff0c;我们可能遇到要将类 A 转为 类 B 的情况#xff0c;此时就可以定义类 A 的转换函数将其按照一定规则转换为 类 B#xff1b; 转换函数声明规则如下#xff1a;
operator 转换类型() const; 转换函数无返回值#x…一 什么是转换函数 在 c 编码中我们可能遇到要将类 A 转为 类 B 的情况此时就可以定义类 A 的转换函数将其按照一定规则转换为 类 B 转换函数声明规则如下
operator 转换类型() const; 转换函数无返回值转换类型是一个已定义的类包括c基本类型 int、double 等也包括事先定义过的类。 这里介绍一下隐式转换的知识点 所谓隐式转换由编译器私下进行的类型转换该转换不需要使用者干预。 当一个值拷贝给另外一个兼容类型的值时 往往会发生自动转换 int a 3;double b 4.5;double c a b; // a将会被自动转换为double类型转换的结果和b进行加法操作
二 例子
1. 转换函数
// 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
#includeiostreamint main()
{Fraction f(5, 10);double re1 1 f; // 编译器编译到这里时会尝试去寻找编译通过的方法类的转换函数就是其中一种方法, 当发现 Fraction 没有 operator(Fraction) 重载函数但是有转换函数时编译是可以通过的std::cout re1 std::endl;return 0;
}
输出 1.5 2. 隐式转换
// fraction.hclass 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
#includeiostreamint main()
{Fraction f(5, 10);Fraction f2 f 3; // 编译器利用构造函数 将 3 隐式转换为 Fractionstd::cout f.m_numerator , f.m_denominator std::endl;return 0;
}输出 35, 10 3. 禁用隐式转换 explicit 关键字修饰构造函数后则禁止编译器私自做隐式转换
// 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
#includeiostreamint main()
{Fraction f(5, 10);Fraction f2 f 3; // 因为禁用了隐式转换因此无法编译通过std::cout f.m_numerator , f.m_denominator std::endl;return 0;
}