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.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
#include<iostream>int 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
#include<iostream>int main()
{Fraction f(5, 10);Fraction f2 = f + 3; // 因为禁用了隐式转换,因此无法编译通过std::cout << f.m_numerator << ", " << f.m_denominator << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于chaos混沌的彩色图像加解密系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 混沌理论简介 4.2 基于混沌的图像加密原理 4.3 数学公式与实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................…

记录将C语言编写的Windows程序转换为python语言编写,演示具体效果在最后,这对初学者理解Windows消息机制及框架有一定参考作用

主要思路 由于C语言的数组定义使用名字加中括号及括号内数字定义&#xff0c;但是在python中【】已经被作为列表 元组等序列类型分片、存取元素&#xff0c;因此我们不能像C语言那样定义数组 例如C语言 int a[10] 是声明定义一个含有10个int类型的数组a,而在执行语句部分…

Android基础:使用Intent意图类 和 Bundle类对安卓页面Activity页面进行数据的传递 实现Activity页面之间通信技术

Android Intent 和 Bundle与Activity之间的通信 下面是Android基础&#xff1a;使用Intent意图类 和 Bundle类对安卓页面Activity页面进行数据的传递 && 实现Activity页面之间通信技术 ** 实现的目的 **&#xff1a;页面之间的数据传输&#xff0c;通过将数据打包传递…

华为OD机试真题B卷 Java 实现【统计大写字母个数】,附详细解题思路

一、题目描述 找出给定字符串中大写字符(即’A’-‘Z’)的个数。 数据范围&#xff1a;字符串长度&#xff1a;1≤∣s∣≤250 字符串中可能包含空格或其他字符 二、输入描述 对于每组样例&#xff0c;输入一行&#xff0c;代表待统计的字符串。 三、输出描述 输出一个整…

【1day】​万户协同办公平台 iSignatureHTML.jsp/DocumentEdit.jsp 文件SQL注入漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现

【css】css实现文字两端对齐效果:

文章目录 一、方法1&#xff1a;二、方法2&#xff1a;三、注意&#xff1a; 一、方法1&#xff1a; 给元素设置 text-align: justify;text-align-last: justify;并且加上text-justify: distribute-all-line; 目的是兼容ie浏览器 p{width: 130px;text-align: justify;text-alig…

飞天使-linux操作的一些技巧与知识点3-http的工作原理

文章目录 http工作原理nginx的正向代理和反向代理的区别一个小技巧dig 命令巧用 http工作原理 http1.0 协议 使用的是短连接&#xff0c;建立一次tcp连接&#xff0c;发起一次http的请求&#xff0c;结束&#xff0c;tcp断开 http1.1 协议使用的是长连接&#xff0c;建立一次tc…

Network 灰鸽宝典【目录】

目前已有文章 21 篇 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 服务配置环境部署GitNPM 浏览器编辑器系…

GEE:重分类

作者:CSDN @ _养乐多_ 本文记录了在 Google Earth Engine(GEE)平台上对一副类别图像进行重分类的代码。并以 COPERNICUS/Landcover/100m/Proba-V-C3/Global 数据集中的土地利用数据为例。 结果如下图所示, 文章目录 一、核心函数二、示例代码三、代码链接一、核心函数 核…

文件操作及函数

什么是文件&#xff1f; 在程序设计中&#xff0c;文件有两种&#xff1a;程序文件和数据文件。 程序文件 包括源程序文件&#xff08;.c&#xff09;&#xff0c;目标文件&#xff08;.obj&#xff09;&#xff0c;可执行程序(.exe)。 数据文件 文件的内容不一定是程序&…

linux下部署frp客户端服务端-内网穿透

简介 部署在公司内部局域网虚拟机上的服务需要在外网能够访问到&#xff0c;这不就是内网穿透的需求吗&#xff0c;之前通过路由器实现过&#xff0c;现在公司这块路由器不具备这个功能了&#xff0c;目前市面上一些主流的内网穿透工具有&#xff1a;Ngrok&#xff0c;Natapp&…

Docker镜像构建:深入Dockerfile创建自定义镜像

Docker的强大之处在于其能够通过Dockerfile定义和构建自定义镜像&#xff0c;为应用提供独立、可移植的运行环境。在这篇博客文章中&#xff0c;将深入探讨Docker镜像构建的核心概念&#xff0c;通过更加丰富的示例代码&#xff0c;帮助大家全面理解和掌握构建自定义镜像的技术…

深度学习在人体动作识别领域的应用:开源工具、数据集资源及趋动云GPU算力不可或缺

人体动作识别检测是一种通过使用计算机视觉和深度学习技术&#xff0c;对人体姿态和动作进行实时监测和分析的技术。该技术旨在从图像或视频中提取有关人体姿态、动作和行为的信息&#xff0c;以便更深入地识别和理解人的活动。 人体动作识别检测的基本步骤包括&#xff1a; 数…

关于MySQL的bigint问题

MySQL的bigint(8)能存多大数值&#xff1f; MySQL的BIGINT(8)可以存储的数值范围是从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。这是因为BIGINT数据类型在MySQL中使用8字节进行存储&#xff0c;每个字节有8位&#xff0c;所以总共可以表示2^64个不同的整数。 …

IDEA 出现问题:git提交commit时Perform code analysis卡住解决方案

问题 git提交commit时Perform code analysis卡住很久 解决方案一 1、打开 IntelliJ IDEA&#xff0c;进入 File -> Settings&#xff08;或者使用快捷键 CtrlAltS&#xff09;。 2、在弹出的 Settings 窗口中&#xff0c;找到 Version Control -> Commit Dialog 选项…

什么是数字化营销?如何进行数字化营销?数字化有多重要?

引言 数字化营销是一种利用数字技术和在线平台来促进产品或服务销售的策略。它包括利用各种数字渠道&#xff0c;如社交媒体、搜索引擎优化、内容营销和数据分析等&#xff0c;与目标受众建立联系并推动销售。 在当今商业环境中&#xff0c;数字化营销扮演着至关重要的角色。…

阿里云国际版无法远程连接Windows服务器的排查方法

如果您遇到紧急情况&#xff0c;需要尽快登录Windows实例&#xff0c;请参见以下操作步骤&#xff0c;先检查ECS实例的状态&#xff0c;然后通过云助手向Windows实例发送命令或通过VNC登录实例&#xff0c;具体步骤如下&#xff1a; 步骤一&#xff1a;检查ECS实例状态 无论何…

SpringBoot之请求的详细解析

1. 请求 在本章节呢&#xff0c;我们主要讲解&#xff0c;如何接收页面传递过来的请求数据。 1.1 Postman 之前我们课程中有提到当前最为主流的开发模式&#xff1a;前后端分离 在这种模式下&#xff0c;前端技术人员基于"接口文档"&#xff0c;开发前端程序&…

智能优化算法应用:基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.萤火虫算法4.实验参数设定5.算法结果6.参考文…

Unity检测AssetBundle是否循环依赖

原理&#xff1a;bundle的依赖关系构建一个二维的矩阵图&#xff0c;如果对角线相互依赖&#xff08;用1标记&#xff09;则表示循环依赖。 using PlasticGui; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public cl…