C++ primer plus 使用类下

目录

前言

一  转换函数

总结


前言

接着上一章的内容


一  转换函数

接着我们上一章节的内容,我们知道我们类里面有一个自动转换利用=这个运算符,这样就可以使得对象可以接受这个值

那么有没有可以使一个普通类型去接收一个对象呢?
答案是有的,这就是转换函数,也叫C++运算符函数
我们通过代码来理解这个概念
头文件

#ifndef __COOL_H__
#define __COOL_H__using namespace std;
class Stonewt{private:static const int Lbs_per_stn = 14;int stone;double pds_left;double pounds;public:Stonewt(double lbs);Stonewt(int stn, double lbs);Stonewt();void show_lbs()const;void show_stn()const;operator int () const;operator double() const;
};#endif

工具函数

#include<iostream>
#include"cool.h"
using namespace std;Stonewt::Stonewt(double lbs){stone = (int)lbs / Lbs_per_stn;pds_left = (int)lbs % Lbs_per_stn + lbs - (int)lbs;pounds = lbs;
}Stonewt::Stonewt(int stn, double lbs){stone = stn;pds_left = lbs;pounds = stn * Lbs_per_stn + lbs;
}Stonewt::Stonewt(){stone = pds_left = pounds = 0;
}void Stonewt::show_lbs()const{cout << "stone = " << stone << "pds_left = " << pds_left << endl;
}void Stonewt::show_stn()const{cout << "pounds = " << pounds << endl;
}Stonewt::operator int() const{return (int)(pounds + 0.5);
}Stonewt::operator double() const{return pounds;
}

main函数

#include<iostream>
#include"cool.h"
using namespace std;int main(){Stonewt popo(9,2.8);double a = popo;cout << a << endl;return 0;
}

首先我们要用一个double类型的a进行赋予对象的时候,这个时候如果你没有写转换函数的时候,这个时候是会报错的,所以我们还要加上转换函数

编译器会识别这里的左值是普通类型,右边为我们自定义类型,编译器会去寻找这个转换函数来进行转换,从而实现对象到普通类型的转换

书写的格式:operator typeName() ;
这里的operator表示操作也就是用到转换函数的
这个后面就是我们要转换的类型

请注意以下几点:
• 转换函数必须是类方法
• 转换函数不能指定返回类型
• 转换函数不能有参数

例如,转换为doub1e类型的函数的原型如下: operator double();

陷阱
当我们程序里面有两个强制转换的类型,这个时候不写显示转换的话就会导致编译器不知道转换到哪一种类型,但是当我们只有一个强制转换类型的函数的时候,就可以这么写

对于这个陷阱我们有两解决办法
1  在前面加上explicit,表示这个只可以用显示进行强制转换,不可以进行隐式的转换
2  可以写成成员函数


总结

学习了我们可以从对象转换到普通类型的方法:转换函数
这个转换函数要注意点就是我们书写多个的时候要注意会出现二义性错误
然后就是我们要巧妙使用explicit这个关键词和运用成员函数解决这个问题
书写格式是operator  typename( )这个格式
 

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

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

相关文章

声网自研算法如何重定义AI交互容灾标准

在咖啡厅里&#xff0c;当我把手机置于咖啡机与微波炉形成的电磁干扰区时&#xff0c;WiFi丢包率飙升至83%&#xff0c;但AI的回应延迟仅从1.2秒增至1.4秒。这背后是声网自研的Phoenix抗弱网算法在发挥作用&#xff0c;通过AI驱动的动态FEC&#xff08;前向纠错&#xff09;机制…

详解布隆过滤器及其模拟实现

目录 布隆过滤器 引入 概念 工作原理 模拟实现布隆过滤器 哈希函数集 布隆过滤器基本框架 add函数&#xff08;添加到布隆过滤器中&#xff09; contains函数&#xff08;判断是否存在该值&#xff09; 完整代码 布隆过滤器的删除 布隆过滤器的误判率 布隆过滤器的…

巧用 VSCode 与 AI 编码提升 Vue 前端开发效率

在当今快节奏的软件开发领域&#xff0c;提升开发效率是每个开发者都追求的目标。对于 Vue 前端开发而言&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已经成为了众多开发者的首选编辑器。而随着人工智能技术的发展&#xff0c;各类 AI 编码扩展工具如雨后春笋…

5分钟快速申请一个EDU教育邮箱

感谢CSDN作者 CodeDevMaster 于 2023-10-16 13:22:40 发布作品《5分钟快速申请一个EDU教育邮箱》 本文内容为作者方法的实践与复刻&#xff0c;同时 现在是2025/03/17&#xff0c;执行的细节有部分变动&#xff0c;所以完整展示一波。 祝各位好运&#xff0c;同时本案例中展示…

Go string 字符串底层逻辑

在 Go 语言中&#xff0c;string 类型的底层结构是一个结构体&#xff0c;包含两个字段&#xff1a;一个指向字节数组的指针和该字节数组的长度。以下是其在 Go 源码中的大致定义&#xff1a;type stringStruct struct {str unsafe.Pointerlen int } str&#xff1a;这是一个指…

【NLP】10. 机器学习模型性能评估指标(含多类别情况), ROC,PRC

机器学习模型性能评估指标&#xff08;含多类别情况&#xff09; 1. 模型评估指标简介 在机器学习中&#xff0c;模型的性能评估非常重要。常用的模型评估指标有&#xff1a; 准确率&#xff08;Accuracy&#xff09;精度&#xff08;Precision&#xff09;召回率&#xff0…

开源通义万相本地部署方案,文生视频、图生视频、视频生成大模型,支持消费级显卡!

开源通义万相本地部署方案&#xff0c;文生视频、图生视频、视频生成大模型&#xff0c;支持消费级显卡&#xff01; 万相2.1开源 近日&#xff0c;大模型万相2.1&#xff08;Wan&#xff09;重磅开源&#xff0c;此次开源采用Apache2.0协议&#xff0c;14B和1.3B两个参数规格…

机器学习与深度学习中模型训练时常用的四种正则化技术L1,L2,L21,ElasticNet

L1正则化和L2正则化是机器学习中常用的两种正则化方法&#xff0c;用于防止模型过拟合。它们的区别主要体现在数学形式、作用机制和应用效果上。以下是详细对比&#xff1a; 1. 数学定义 L1正则化&#xff08;也叫Lasso正则化&#xff09;&#xff1a; 在损失函数中加入权重参…

qt+opengl 播放yuv视频

一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

Android开源库——RxJava和RxAndroid

RxJava和RxAndroid是什么&#xff1f; RxJava是基于JVM的响应式扩展&#xff0c;用于编写异步代码 RxAndroid是关于Android的RxJava绑定 RxJava和RxAndroid使用 依赖 implementation io.reactivex.rxjava3:rxjava:3.1.0 implementation io.reactivex.rxjava3:rxandroid:3.…

并发基础—三大问题:可见性、原子性、有序性

文章目录 可见性原子性有序性&#xff08;指令重排&#xff09;经典的指令重排案例&#xff1a;单例模式的双重检查锁volatile和synchronize都可以保证有序性并发压测工具Jcstress证明指令重排会在多线程下出现问题&#xff08;了解&#xff09;CPU缓存分为三个级别&#xff1a…

PyTorch 入门学习

目录 PyTorch 定义 核心作用 应用场景 Pytorch 基本语法 1. 张量的创建 2. 张量的类型转换 3. 张量数值计算 4. 张量运算函数 5. 张量索引操作 6. 张量形状操作 7. 张量拼接操作 8. 自动微分模块 9. 案例-线性回归案例 PyTorch 定义 PyTorch 是一个基于 Python 深…

Hive SQL 精进系列:REGEXP_REPLACE 函数的用法

目录 一、引言二、REGEXP_REPLACE 函数基础2.1 基本语法参数详解2.2 简单示例 三、REGEXP_REPLACE 函数的应用场景3.1 去除特殊字符3.2 统一字符串格式 四、REGEXP_REPLACE 与 REPLACE 函数的对比4.1 功能差异4.2 适用场景 五、REGEXP_REPLACE 与 REGEXP 函数的对比5.1 功能差异…

从0开始搭建微服务架构特别篇SpringCloud网关聚合knife4j

前言&#xff1a;总所周知项目开发接口测试需要knife4j&#xff0c;但是&#xff0c;微服务架构中微服务很多&#xff0c;模块地址很多&#xff0c;需要统一管理api测试&#xff0c;就需要聚合在网关统一调用&#xff0c;本章&#xff0c;就说明如何通过网关聚合使用knife4j。 …

Spring Cloud 中的服务注册与发现: Eureka详解

1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时&#xff0c;URL 是写死的&#xff0c;例如&#xff1a; String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时&#xff0c;这个 URL 就需要相应地变…

网页制作15-Javascipt时间特效の记录网页停留时间

01效果图&#xff1a; 02运用&#xff1a; window.setTimeout&#xff08;&#xff09;刷新function&#xff08;&#xff09;函数document.forms&#xff08;&#xff09;&#xff1a;表单if条件语句window.alert&#xff08;&#xff09;窗口警示 03、操作代码&#xff1a;…

【Rust基础】排序和分组

排序 简单排序 整数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //✔assert_eq!(list, vec![1, 2, 3, 4, 5]); }小数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//❌ 不能直接使用sort&#xff0c;因为f32和f64未实现O…

C++ std::list超详细指南:基础实践(手搓list)

目录 一.核心特性 1.双向循环链表结构 2.头文件&#xff1a;#include 3.时间复杂度 4.内存特性 二.构造函数 三.list iterator的使用 1.学习list iterator之前我们要知道iterator的区分 ​编辑 2.begin()end() 3.rbegin()rend() 四.list关键接口 1.empty() 2. size…

996引擎 - 红点系统

996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…

C语言——变量与常量

C语言中的变量与常量&#xff1a;简洁易懂的指南 在C语言编程中&#xff0c;变量和常量是最基本的概念之一。理解它们的区别和使用方法对于编写高效、可维护的代码至关重要。本文将详细介绍C语言中的变量和常量&#xff0c;并通过图表和代码示例帮助你更好地理解。 目录 什么…