C++类的自动转换和强制类型转换

目录

一、类型转换        

二、转换函数


一、类型转换        

        C++⽀持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数
        简单说就是可以将内置类型转化为自定义类型
        示例:
class Test
{
public:Test(int n1 = 0):num1(n1){}void print(){cout << num1 << endl;}
private:int num1;
};
int main()
{Test t1(100);t1.print();//C++⽀持内置类型隐式类型转换为类类型对象Test t2 = 100;t2.print();return 0;
}

        结果:

        程序将使用构造函数【Test ( int n1 )】 来创建一个临时的【Test】对象,,并将【100】作为初始值。随后在使用默认的拷贝构造函数将内容拷贝到【t2】中。这一过程称为隐式类型转换

        一个参数就要有一个参数的构造函数, 二个参数就要有二个参数的构造函数

        示例: 

class Test
{
public:Test(int n1 = 0, int n2 = 0):num1(n1),num2(n2){}void print(){cout << num1 << " " << num2 << endl;}
private:int num1;int num2;
};
int main()
{Test t1(100, 200);t1.print();//C++⽀持内置类型隐式类型转换为类类型对象Test t2 = { 100,200 };t2.print();return 0;
}

        将构造函数用于类型转换似乎是一项不错的特性,但是这种特性并非总是合乎需要,因此这总有可能导致意外发生

        C++新增了一个关键字【explicit】,用于关闭将构造函数用于类型转换

         示例:

class Test
{
public://explicit用于关闭将构造函数用于类型转换explicit Test(int n1 = 0):num1(n1){}
private:int num1;
};
Test t = 100;

        会报错 :

 

        如果使用了【explicit】限定了构造函数,规定它不可以用于隐式转换,但是它可以用于显示转换 

         示例:

class Test
{
public://explicit用于关闭将构造函数用于类型转换explicit Test(int n1 = 0):num1(n1){}void print(){cout << num1 << endl;}
private:int num1;
};
int main()
{//explicit限定了构造函数,规定它不可以用于隐式转换,但是它可以用于显示转换 Test t = (Test)100;t.print();return 0;
}

        结果:

 

二、转换函数

        既然内置类型可以转换为自定义类型,那么自定义类型可以转换为内置类型吗

        自定义类型是可以转换为内置类型,但是不是使用构造函数。要进行自定义类型转换为内置类型,必须要使用特殊的C++运算符函数——转换函数

        示例: 

class Test
{
public:Test(int n1 = 0):num1(n1){}//转换函数operator int() const{return num1;}
private:int num1;
};
int main()
{Test t1 = 100;int num = t1;cout << num << endl;return 0;
}

        结果:

转换函数的特点 

  • 转换函数必须是类方法
  • 转换函数不能指定返回值
  • 转换函数不能有参数

转换函数的形式

        operator typename ( );

        【typename】指出了要转换的类型,因此不需要指定返回值类型。转换函数是类方法意味着:它需要通过类对象来调用,从而告知函数要转换的值。因此函数不需要参数

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

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

相关文章

什么是sfp,onu,​为什么PON(​俗称“光猫”​)模块使用SC光纤接口

在现代网络设备中&#xff0c;我们经常会看到SFP或SFP接口的身影&#xff0c;这些接口有时被简称为光口&#xff0c;但这个称呼并不严谨。有些厂商则称之为多功能口或多用途口&#xff0c;然而这对于不了解的人来说可能还是一头雾水。SFP&#xff0c;即Small Form-Factor Plugg…

【Linux】线程池设计 + 策略模式

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 线程池 1-1 ⽇志与策略模式1-2 线程池设计1-3 线程安全的单例模式1-3-1 什么是单例模式1-3-2 单例模式的特点1-3-3 饿汉实现⽅式和懒汉实现⽅式1-3-4 饿汉…

flutter项目AndroidiOS自动打包脚本

从业数年余,开发出身,经数载努力位项目经理,因环境欠佳,终失业.失业达七月有余,几经周转,现又从开发,既回原点亦从始.并非与诸位抢食,仅为糊口,望海涵!因从头开始,所经之处皆为新奇,遂处处留痕以备日后之需. 自动打包脚本原文地址:https://zhuanlan.zhihu.com/p/481472311 转…

挂载本地目录到k8s的pod实现持久化存储

本地目录实现持久化存储 容器是无状态的,每次重启都是新的进程,但是我们需要将一些状态数据如配置、用户数据等存到本地来方便新的容器可以拿到历史状态。先创建一个目录来存放数据,并且挂载到minikube虚拟机内(不是pod里面)。注意要新开一个终端来调用,这个命令会阻塞,…

循环神经网络:从基础到应用的深度解析

&#x1f35b;循环神经网络&#xff08;RNN&#xff09;概述 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种能够处理时序数据或序列数据的深度学习模型。不同于传统的前馈神经网络&#xff0c;RNN具有内存单元&#xff0c;能够捕捉序列中前后信息…

【言语理解】中心理解题目之结构分析

3.1 五种常见对策表达方式 3.1.1 祈使或建议给对策 应该&#xff08;应&#xff09; 需要&#xff08;要&#xff09; eg&#xff1a;……。对此&#xff0c;媒体要做好自我规约。……。 eg&#xff1a;……。然而&#xff0c;两地仅简单承接北京转移的一般产业是远远不够的&a…

嵌入式开发之Bootloader移植(一)

1、Bootloader基本概念 Bootloader是硬件启动的引导程序,是运行操作系统的前提; 在操作系统内核或用户应用程序运行之前运行的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境; 在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成…

【Leecode】Leecode刷题之路第61天之旋转链表

题目出处 61-旋转链表-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 61-旋转链表-官方解法 方法1&#xff1a;闭合为环 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…

【H2O2|全栈】Node.js(3)

目录 前言 开篇语 准备工作 get和post登录校验测试 准备 创建应用 数据 端口监听 get方式校验 代码 测试 ​编辑 post方式校验 代码 测试 中间件 概念 流程 结束语 前言 开篇语 本系列博客分享Node.js的相关知识点&#xff0c;本章讲解登录校验原理和中间…

MobaXterm Sessions 批量录入导入,会话批量添加

此脚本用于将服务器批量录入到 MobaXterm 会话 使用方法&#xff1a; 1、将IP列定义在 sessions_ip_list 变量中&#xff08;ssh登录的IP&#xff09; 2、将登录用户定义在 sessions_user 变量中&#xff08;ssh登录的用户&#xff09; 3、将目录名称定义在 folder_name 变…

mysql之基本常用的语法

mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法&#xff1a;insert into table_name(列名1,列名2,....,列名n) values (值1,值…

ASUS/华硕天选5Pro酷睿版 FX607J 原厂Win11 23H2系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…

详解HTML5语言

文章目录 前言任务一 认识HTML5任务描述&#xff1a;知识一 HTML5基础知识 任务二 HTML 5语义元素任务描述&#xff1a;知识一 HTML5新增结构元素知识二 HTML5文本语义元素 总结 前言 HTML5是一个新的网络标准&#xff0c;现在仍处于发展阶段。目标是取代现有的HTML 4.01和XHT…

【VBA实战】使用Word制作简易的考试及阅卷系统

这个事源于公司想简化面试流程&#xff0c;希望能通过一些简单的笔试及自动阅卷来提高对候选人的初步筛选工作的效率和准确性。我当时的想法是这样的&#xff1a; 1. 利用AI工具生成一个笔试题库&#xff0c;只要选择题和填空题 2. 利用VBA工具&#xff0c;根据需求自动从题库…

读书分享(二)| 心智的成熟之旅

概述 人生苦难重重&#xff08;承认这一现实&#xff0c;就不会这么痛苦了。在苦这个事儿上&#xff0c;人人生而平等。苦中作乐才是人生的使命&#xff09;规避问题和逃避痛苦的趋向&#xff0c;是人类心理疾病的根源。只有心智成熟的人&#xff0c;才有能力改变人生。我们唯…

vue3中如何设置路由,使浏览器可以访问组件?

文章目录 1. 安装 vue-router2. 创建路由模块3. 在 main.js 中使用路由4. 注意 1. 安装 vue-router 首先&#xff0c;如果还没有安装 vue-router&#xff0c;需要在项目目录下通过命令行进行安装。假设你的项目是基于npm管理包的&#xff0c;使用以下命令安装&#xff1a; npm…

LVS-DR工作模式简介(相对nat性能更高)

LVS-DR工作模式简介(相对nat性能更高)1.工作原理:共享ip修改mac(保证识别回包的mac地址)共享ip:虚拟网卡接口lo修改mac:内核参数在这种模式下&#xff0c;LVS调度器&#xff08;也称为Director&#xff09;和后端真实服务器&#xff08;Real Server&#xff09;都配置有相同的V…

Libevent库-http通信不同请求方式的处理

做项目的时候用到了http通信&#xff0c;同事用libevent库写的&#xff0c;特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…

qt QToolBox详解

1、概述 QToolBox是Qt框架中的一个控件&#xff0c;它提供了一个带标签页的容器&#xff0c;用户可以通过点击标签页标题来切换不同的页面。QToolBox类似于一个带有多页选项卡的控件&#xff0c;但每个“选项卡”都是一个完整的页面&#xff0c;而不仅仅是标签。这使得QToolBo…

跨UI发送信号

如何自定义信号 1.使用signals声明 2.返回值是void 3.在需要发送的地方使用 emit 信号名字(参数); 进行发送 4.在需要链接的地方使用connect进行链4 接 signals:void sig_addOne(int value); connect(&dlg,&SetDialog::sig_addOne,[](int value){ui->lineEdit…