当前位置: 首页 > news >正文

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

文章目录

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

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

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

说到重载类型转换它比较奇特:
和其他的重载类型不同, 它不声明返回类型, 将名称作为返回类型.
我们能用它干什么呢? 它可以:

int -> A (class)
// 去实现这两个
A (class) -> int
A (class) -> B (class)
.....

A(class) -> int

具体Yuan -> int
我们编写了一个名为operator int()的新重载运算符.
注意:operator和int()之间有空格, 否则编译其识别不了, 其他的重载可以没有空格, 也可以有.
在这里插入图片描述

#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 -> intreturn 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时,我们可以有三种选择:

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

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

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

辅助函数 Jiao->int

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

main.cpp调用


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

源码以及实现:

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

在这里插入图片描述

http://www.dtcms.com/a/503113.html

相关文章:

  • SKY77645 导致的Rach failure问题
  • C++模版:模板初阶及STL简介
  • 微网站策划方案厦门的网站建设公司
  • 织梦网站404页面模板成都全网推广哪家专业
  • Solidity智能合约存储与数据结构精要
  • 生活化讲解Controller - 餐厅的“前台接待员“
  • AI大事记12:Transformer 架构——重塑 NLP 的革命性技术(下)
  • 微信公众号登录wordpress网站湛江企业网站怎么建设
  • 智慧校园总体解决方案PPT(98页)
  • ComfyUI-DynamiCrafterWrapper:开启ComfyUI动图创作新时代
  • 关于国家授时中心遭受美国国家安全局网络攻击事件的技术分析报告
  • PyGAD使用指南
  • 洛谷 B3841 [GESP202306 二级] 自幂数判断
  • 英诺赛科(02577.HK)
  • 做网站服务器什么配置如何建设一个简易的网站
  • 在网站上做承诺书工程平台公司做什么的
  • 深入学习Spring Boot框架
  • 深度拷贝详解
  • 李宏毅机器学习笔记21-26周汇总
  • 特别分享:IOPaint概念及基础知识
  • 【微服务】(2) 环境和工程搭建
  • 做网站工具 不懂代码网站开发项目交接
  • 外贸网站推广平台哪个好网站建设公司相关资质
  • 2025年智能Agent终极指南:从概念到高效营销工具
  • 网络安全 | 深入了解 X.509 证书及其应用
  • Token快过期的三种续期方案
  • 网站建设html代码优化广东新闻联播今天
  • 微服务之配置中心Nacos
  • 好网站推荐娄底高端网站建设
  • h5游戏免费下载:保卫机器人