c++学习:隐式类型转换+explicit关键字+四种类型转换

目录

隐式类型转换

当定义一个字符串类

想新建一个对象有下面几种方式

但我不想用隐式类型转换得方式来新建,因为隐式转换成了分配若干字节的空字符串,容易令人误解,就要在构造函数前面用explicit关键字来修饰

explicit关键字的用途是  防止隐式转换行为来初始化对象

四种类型转换

4种类型转换操作符

 static_cast

格式

例子 int转换为char

reinterpret_cast

格式

例子  把int*强转为char*

dynamic_cast

格式

例子  新建一个基类和派生类,基类指针指向派生类对象,将基类指针还原成子类指针

const_cast

格式

例子  去除int*的const属性


隐式类型转换

当定义一个字符串类

class MyString
{
public:MyString(int n) {} MyString(const char* p) {} 
private:char*m_ptr;
};

想新建一个对象有下面几种方式

正常新建对象
MyString s0("hello");
MyString s1 = MyString(10);
MyString s2(10);用隐式转换新建对象
MyString s3 = "China";//等价于MyString s3 = MyString("China")
MyString s4 = 10;//分配10个字节的空字符串,等价于MyString s4 = MyString(10)
MyString s5 = 'A';//分配int('A')个字节的空字符串,等价于MyString s5 = MyString(4)

但我不想用隐式类型转换得方式来新建,因为隐式转换成了分配若干字节的空字符串,容易令人误解,就要在构造函数前面用explicit关键字来修饰

class MyString
{
public://explicit 关键字的用途: 防止隐式转换行为来初始化对象explicit MyString(int n) {} explicit MyString(const char* p) {} 
private:char*m_ptr;
};

explicit关键字的用途是  防止隐式转换行为来初始化对象

当声明了explicit后, 编译时就不会自动隐式转换,就会报错

四种类型转换

4种类型转换操作符

  • static_cast                        静态类型转换,如int转换为char  隐式类型转换
  • reinterpret_cast                重新编译类型,强制转换
  • dynamic_cast                   动态类型转换,子类和父类之间的多态类型转换
  • const_cast                        去除变量的只读属性

 static_cast

格式

转换之后该数据类型的变量 = static_cast<你要转换之后的数据类型>(你要转换的变量名)

例子 int转换为char

int val = 97;
//方式1
char ch = val;//val会进行隐式类型转换,当成 字符的ascii来进行处理
//方式2
char ch = static_cast<char>(val);

reinterpret_cast

格式

转换之后该数据类型的变量 = reinterpret_cast<你要转换之后的数据类型>(你要转换的变量名)

例子  把int*强转为char*

int val = 97;
//方式1
char *p = (char*)&val;
//方式2
char*p = reinterpret_cast<char*>(&val);

dynamic_cast

格式

转换之后该数据类型的变量 = dynamic_cast<你要转换之后的数据类型>(你要转换的变量名)

例子  新建一个基类和派生类,基类指针指向派生类对象,将基类指针还原成子类指针

class Base{
public:Base(){}//声明为虚析构,否则 dynamic_cast 动态转换失败virtual ~Base(){}
};
class Child1:public Base
{};//基类指针指向派生类对象
Base *b1 = new Child1;
//方法1 这种转换行为 会导致c1可能发生 内存越界(非法访问内存)
Child1 *c1 = (Child1*)b1;
//方法2 好处:更加标准化 动态类型转换行为会给你做 类型检查,因为有时候可能会存在转换失败的情况
//dynamic_cast 会给你做转换之后的类型检查,如果发现你转换之后,可能存在内存越界的情况,转换就会失败,给你返回NULL
Child1 *c2 = dynamic_cast<Child1*>(b1);
if(c2 == NULL)
{cout<<"dynamic_cast error"<<endl;
}
else{cout<<"dynamic_cast success"<<endl;
}

const_cast

格式

转换之后该数据类型的变量 = const_cast<你要转换之后的数据类型>(你要转换的变量名)

例子  去除int*的const属性

//去除const属性
int data = 10;
int *const p1 = &data;//方法1
int*p2 = (int*)p1;
//方法2
int*p3 = const_cast<int*>(p1);

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

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

相关文章

简述synchronized的实现原理

synchronized是Java中用于实现线程同步的关键字&#xff0c;其实现原理基于JVM的内部机制。当一个线程试图访问一个synchronized代码块时&#xff0c;它必须先获取一个锁。这个锁与对象关联&#xff0c;通常是通过对象的监视器&#xff08;Monitor&#xff09;来实现的。每个Ja…

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容&#xff0c;tree是多维数组&#xff0c;一级一级的对比输入的内容是否匹配&#xff0c;用forEach循环遍历数据&#xff0c;匹配不到在往下找&#xff0c;直到找到为null &#x…

MIT_线性代数笔记:第 25 讲 对称矩阵和正定性

目录 对称矩阵 Symmetric matrices实特征值 Real eigenvalues正定矩阵 Positive definite matrices 对称矩阵是最重要的矩阵之一&#xff0c;其特征值为实数并且拥有一套正交特征向量。正定矩阵的性质则更好。 对称矩阵 Symmetric matrices 包含特殊性质的矩阵&#xff0c;例如…

Probabilistic Forecasting with Temporal Convolutional Neural Network

Abstract 我们提出了一种基于卷积神经网络&#xff08;CNN&#xff09;的概率预测框架&#xff0c;用于多个相关时间序列预测。该框架可用于估计参数和非参数设置下的概率密度。更具体地说&#xff0c;构建基于扩张因果卷积网络的堆叠残差块来捕获序列的时间依赖性。与表示学习…

Certum与Geotrust的SSL证书区别

Certum和GeoTrust都是知名的CA认证机构&#xff0c;这两个品牌下的SSL证书在多个方面存在一些差异。今天就随SSL盾小编了解Certum与Geotrust证书的区别。 一、Certum机构背景 Certum是波兰的一家CA认证机构&#xff0c;成立于2002年&#xff0c;至今已有近20多年的历史。旗下有…

LeetCode-棒球比赛(682)

题目描述&#xff1a; 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成&#xff0c;过去几回合的得分可能会影响以后几回合的得分。 比赛开始时&#xff0c;记录是空白的。你会得到一个记录操作的字符串列表 ops&#xff0c;其中 ops[i] 是你需要记录的第…

基于ZU19EG的100G-UDP解决方案

概述 本文档介绍ZU19EG与Mellanox CX6 100G网卡通信解决方案。 环境配置 FPGA硬件&#xff1a;519-ZU19EG的4路100G光纤PCIe加上计算卡 电脑&#xff1a;国产国鑫主板&#xff08;双PCU&#xff09;&#xff1a;Gooxi G2DA-B CPU:Intel Xeon Silver 2.2GHz 内存&#xff1…

Asp .Net Web应用程序(.Net Framework4.8)网站发布到IIS

开启IIS 如果已开启跳过这步 打开控制面板-程序 打开IIS 发布Web程序&#xff08;.Net Framework 4.8 web网页&#xff09; 进入IIS管理器新建一个应用池 新建一个网站 网站创建完毕 为文件夹添加访问权限 如果不添加访问权限&#xff0c;运行时将会得到如下错误 设置权限 勾…

kubernetes ResourceQuotas Limits(资源配额)

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 简介 当多个用户或团队共享具有固定节点数目的集群时&#xff0c;人们会…

如何测试Web网页的兼容性测试?

测试Web网页的兼容性是一个重要的步骤&#xff0c;以确保网站在不同的浏览器、操作系统和设备上都能正常工作。以下是一些步骤和方法来测试网页的兼容性&#xff1a; 01. 确定目标平台 首先&#xff0c;确定要测试的目标浏览器、操作系统和设备。这通常包括最常用的浏览器&…

bbox_to_anchor调整图例位置

ax.legend([box[boxes][0], box[boxes][1], box[boxes][2], box[boxes][3]],[1961-1990, 1971-2000, 1981-2010, 1991-2020], bbox_to_anchor(0.05, 1), locupper left, ncol2)

使用串口 DMA 模式接收不定长数据

一、简介 曾经遇到客户有一个需求&#xff0c;需要用串口 DMA 的方式接收不定长度的数据&#xff0c;DMA 有个缺点就是在每次传输前需要设定好传输的字节长度&#xff0c;这种方式显然对于接收不定长度的数据来说没有那么灵活。但 DMA 也有着显著的优点&#xff0c;如可直接访…

阿里巴巴中国站 1688 商品详情 API 实时数据获取

一、引言 随着电子商务的快速发展&#xff0c;实时数据获取在商业决策中扮演着越来越重要的角色。阿里巴巴中国站作为国内领先的 B2B 平台&#xff0c;提供了丰富的 API 接口供开发者使用。本文将重点介绍如何通过阿里巴巴中国站的 1688 商品详情 API 实现实时数据获取&#x…

JS新手入门笔记整理:对象

对象可以分为两种&#xff1a;一种是“自定义对象”&#xff0c;另外一种是“内置对象”。自定义对象&#xff0c;指的是需要我们自己定义的对象。内置对象&#xff0c;指的是不需要我们自己定义的&#xff08;即系统已经定义好的&#xff09;、可以直接使用的对象。在JavaScri…

abp vnext 下载指定版本的项目

开发环境 Win11 vs2022 abp vnext 下载地址&#xff1a;Get Started | ABP.IO 下载abp框架之前&#xff0c;需要先安装CLI&#xff0c;打开命令提示符&#xff0c;执行以下命令即可&#xff0c;这个也可以指定版本下载&#xff0c;这里就不做介绍了&#xff0c;以及删除命令…

网络协议到底是什么?

本文介绍了通信协议的概念以及如何通过添加特定的机制和信息来确保无错误的数据传输。 1. 通信协议的概念 协议由所有 "交换 "信息的站点使用的通信规则和程序组成。所有在网络上交换数据的站点都使用协议&#xff0c;以满足目标。 协议是一组预定义的规则和约定&am…

【MySQL】数据库之Redis的持久化

目录 一、Redis的高可用 1.1什么是高可用 1.2Redis的高可用技术 1.3持久化功能 1.4Redis持久化的方式 二、Redis的持久化之RDB 2.1RDB持久化的触发方式 触发条件 RDB持久化的触发分为手动触发和自动触发两种。 &#xff08;1&#xff09;手动触发 &#xff08;2&…

‘pip‘ 不是内部或外部命令、ImportError: cannot import name ‘SCHEME_KEYS‘

错误一&#xff1a;启动程序中出现致命错误:无法使用“f:\pythonv\scripts\python.exe” G:\pythonv\scripts\ pip.exe” 错误二&#xff1a;‘pip‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 错误三&#xff1a;ImportError: cannot import name SCH…

九、分布式锁 —— 超详细操作演示!!!

九、分布式锁 —— 超详细操作演示&#xff01; 九、分布式锁9.1 分布式锁的工作原理9.2 问题引入9.2.1 场景9.2.2 实现9.2.3 分析 9.3 setnx 实现方式9.3.1 原理9.3.2 实现9.3.3 问题 9.4 为锁添加过期时间9.4.1 原理9.4.2 实现9.4.3 问题 9.5 为锁添加标识9.5.1 原理9.5.2 实…

C语言习题集(036)

//写一函数&#xff0c;求一个字符串的长度。在main函数 //中输入字符串&#xff0c;并输出其长度。 /* */ //解答&#xff1a; #include<stdio.h> int length(char *s) { int i; for(i0;i<10000;i) { if(s[i]\0)break; }return i; } int main() { char *s; pr…