C++进阶:重载类型转换

文章目录

  • [A(class) -> int](#A(class) -> int)
  • [A (class) -> B (class)](#A (class) -> B (class))
  • 源码以及实现:

C++ 已经知道如何在内置数据类型之间进行转换。然而,默认情况下,C++ 并不知道如何转换任何我们程序定义的类。

cpp 复制代码
// type conversion
double d { 5 };  //int -> double

// type promotion
void output(int n)
{
	std::cout << n << '\n';
}

char c {};
output(c); // char -> int 


long print(int i)
{
	return i;
}

int i {};
print(i); // int -> long

说到重载类型转换 它比较奇特:

和其他的重载类型不同, 它不声明返回类型, 将名称作为返回类型.

我们能用它干什么呢? 它可以:

cpp 复制代码
int -> A (class)
// 去实现这两个
A (class) -> int
A (class) -> B (class)
.....

A(class) -> int

具体Yuan -> int

我们编写了一个名为operator int()的新重载运算符.
注意:operator和int()之间有空格, 否则编译其识别不了, 其他的重载可以没有空格, 也可以有.

cpp 复制代码
#include <iostream>

class Yuan
{
private:
    int m_yuan {};
public:
    Yuan(int yuan=0)
        :m_yuan{yuan}
    {
    }

    operator int() const
    {
        return m_yuan;
    }
};

void printInt(int value)
{
    std::cout << value << '\n';
}

int main()

    Yuan yuan { 1 };
    printInt(yuan); // Yuan -> int

    return 0;
}

编译器会先注意到printInt();的参数yuan不是一个int类型,它是一个Yuan类型, 然后它会检查是否提供了Yuan到int类型的转换(operator int() const), 既然提供了,它就会调用operator int()函数, 该函数会返回一个int, 然后将返回的int传递给printInt().

这里有几点值得注意:

  • 重载的类型转换必须是非静态成员,并且应该const可以与 const 对象一起使用。
  • 重载的类型转换没有显式参数,因为无法向其传递显式参数。它们仍然有一个隐藏*this参数,指向隐式对象(即要转换的对象)。
  • 重载的类型转换不声明返回类型。转换的名称(例如 int)用作返回类型,因为它是唯一允许的返回类型。这可以避免声明中的冗余。

A (class) -> B (class)

具体Yuan -> Jiao

我们知道1 Yuan (元) = 10 Jiao (角), 而在输出这个Yuan这个类的成员函数m_yuan时,我们可以有三种选择:

cpp 复制代码
//1.class Yuan 里面重载输出运算符operator<<,然后通过std::cout输出.
friend std::ostream& operator<<(std::ostream& out, Yuan& yuan)
{
	return out << yuan.m_yuan;
}
Yuan yuan{};
std::cout << yuan;
sh
//2.class Yuan 里面重载类型转换, 然后调用printInt()将Yuan隐式转换int输出
operator int() const
{
    return m_yuan;
}
void printInt(int value)
{
    std::cout << value << '\n';
}
Yuan yuan{};
printInt(yuan);

//3.class Yuan 里面增加成员函数getYuan()方法,然后调用该方法输出.
int getYuan() const
{
	return m_yuan;
}
Yuan yuan{};
std::cout << yuan.getYuan() << '\n';

为了对应主题-重载类型转换, 我们Jiao 依然选择方法2, A -> int. A (class) -> B (class)的思路如下:

先来实现Class Jiao, 然后重载int的类型转换, 实现Jiao->int

cpp 复制代码
class Jiao
{
private:
    int m_jiao {};
public:
    Jiao(int jiao=0)
        :m_jiao{jiao}
    {
    }

    operator int() const
    {
        return m_jiao;
    }
};

再实现Class Yuan,然后重载Jiao的类型转换, 实现Yuan-> Jiao

cpp 复制代码
class Yuan
{
private:
    int m_yuan {};
public:
    Yuan(int yuan=0)
        :m_yuan{yuan}
    {
    }

    operator Jiao() const
    {
        return Jiao { m_yuan * 100 };
    }
};

辅助函数 Jiao->int

cpp 复制代码
void printJiao(Jiao jiao)
{
    std::cout << jiao << '\n';
}

main.cpp调用

cpp 复制代码
int main()
{
    Yuan yuan { 1 };
    printJiao(yuan);

    return 0;
}

源码以及实现:

cpp 复制代码
#include <iostream>

class Jiao
{
private:
    int m_jiao {};
public:
    Jiao(int jiao=0)
        :m_jiao{jiao}
    {
    }

    operator int() const
    {
        return m_jiao;
    }
};
class Yuan
{
private:
    int m_yuan {};
public:
    Yuan(int yuan=0)
        :m_yuan{yuan}
    {
    }

    operator Jiao() const
    {
        return Jiao { m_yuan * 10 };
    }
};

void printJiao(Jiao jiao)
{
    std::cout << jiao << '\n';
}

int main()
{
    Yuan yuan { 1 };
    printJiao(yuan);

    return 0;
}
相关推荐
逝水无殇4 分钟前
C# 枚举(Enum)详解
开发语言·后端·c#
AOwhisky14 分钟前
Linux(CentOS)系统管理入门笔记(第四期)——文件系统(下篇):文件与目录操作实战——cpmvmkdirrmln
linux·运维·笔记·centos·云计算·文件系统
nianniannnn16 分钟前
c++复习自存--标准模板库STL
开发语言·c++·windows
努力努力再努力wz25 分钟前
【高性能网络库与HTTP Server系列】:基于主从 Reactor 模型实现高性能 C++ 网络库与 HTTP Server
开发语言·网络·数据结构·数据库·c++·网络协议·http
什巳32 分钟前
JAVA练习275-乘积最大子数组
java·开发语言·数据结构·算法
岑梓铭36 分钟前
考研408《操作系统》复习笔记,第四章《4.2.2 文件操作、文件共享、文件保护》
linux·考研·操作系统·文件系统·408
lang2015092837 分钟前
Apache POI Word(docx) 实战教程:从入门到精通表格合并、图片插入与文档合并
java·开发语言·word
Robot_Nav40 分钟前
C++ 面试常问问题汇总:基础语法、面向对象、STL、多线程与设计模式
c++·设计模式·面试
Mr.HeBoYan43 分钟前
DPDK为什么越来越少使用rte_ring?——从Lock-Free到Run-to-Completion,重新理解现代DPDK架构演进(上)
linux·网络·算法·性能优化·架构·dpdk
盐焗鹌鹑蛋1 小时前
【C++】二叉搜索树
c++