C++ 学习系列 -- conversion function

一  什么是转换函数?

       在 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
#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. 隐式转换

// 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 关键字修饰构造函数后,则禁止编译器私自做隐式转换

// 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;
}

相关推荐

  1. C++ 学习系列 -- conversion function

    2023-12-13 11:04:06       54 阅读
  2. C++ 学习系列 -- using关键字

    2023-12-13 11:04:06       56 阅读
  3. C# 系统学习(框架学习

    2023-12-13 11:04:06       40 阅读
  4. C#——系统学习(LINQ)

    2023-12-13 11:04:06       40 阅读
  5. 如何系统学习 C#

    2023-12-13 11:04:06       44 阅读
  6. C# —— 系统学习(控制结构)

    2023-12-13 11:04:06       42 阅读
  7. C# 系统学习(异步编程)

    2023-12-13 11:04:06       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-13 11:04:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-13 11:04:06       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-13 11:04:06       87 阅读
  4. Python语言-面向对象

    2023-12-13 11:04:06       96 阅读

热门阅读

  1. 接口优化思路 - 接口防抖

    2023-12-13 11:04:06       51 阅读
  2. day14 二叉树(一)

    2023-12-13 11:04:06       63 阅读
  3. Qt 面试指南

    2023-12-13 11:04:06       48 阅读
  4. 【Linux】CentOS部分命令

    2023-12-13 11:04:06       58 阅读
  5. leetcode19. 删除链表的倒数第 N 个结点

    2023-12-13 11:04:06       51 阅读
  6. 和为K的子数组(LeetCode 560)

    2023-12-13 11:04:06       58 阅读
  7. Docker笔记:关于Dockerfile及构建镜像

    2023-12-13 11:04:06       60 阅读
  8. centos7部署docker环境

    2023-12-13 11:04:06       55 阅读
  9. 【微服务案例介绍】

    2023-12-13 11:04:06       63 阅读