C++类型强转

2024-01-01 04:38
文章标签 c++ 类型 强转

本文主要是介绍C++类型强转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据类型强转,可以用C风格的强转和C++下的运算符强转。
数据类型强转包括:内置对象和内置对象之间,自定义对象和自定义对象之间,指针(引用)之间,指针与对象之间,对象与指针之间。

经过测试,具体强转规则有:
1).C风格强转:C++把它保留了下来,以利于兼容;可“对应”一切C++运算符强转;有几种情况不能强转:自定义类型对象(无继承关系)之间不能强转;不能将基类对象转换为子类对象)。

2).static_cast: 一般的强转都可以,除了C风格强转不能转的情况之外,还有: 1.不能把没有继承关系的类的指针之间进行转换; 2.不能把对象转换为指针,指针转换为对象。
3).reinterpret_cast: 1.只能用于指针和引用;不能用于对象之间;2.内置类型,(一定情况下)可以把对象转换为指针,指针转换为对象;继承关系类之间不可以;3.任何自定义类型不可以进行从指针到对象,对象到指针的转换。

4).dynamic_cast: 1. 只能用于继承关系的指针和引用 2. 只能将子类型指针转换为基类型指针。
5).const_cast: 1. 只能用于指针和引用 2. 将const指针转化为普通指针(除C风格转换外),只能用const_cast 。

#include <iostream>
using namespace std;struct sCast1
{int a;int b;
};struct sCast2
{int a;char b;char c;
};class cFather
{public:int a, b;
};class cSon:public cFather
{public:int c;char d;
};//C风格的强转对应所有C++ name_cast<T*>(var)强转。
//1.数字类型和数字类型、指针和指针之间可以相互转换;
//2.内置类型,(一定情况下)可以把对象转换为指针,指针转换为对象;
//3.不能把一个类型(对象)转换成其他任何类型(对象);
//4.但是子类对象可以转换为父类对象。
void test_Cstyle()
{char x = 'a';int y0 = x;int y1 = (int)x;int y2 = int(x); //这种转换是C++的      int *y3 = (int*)x; //对象到指针int y4 = (int)y3; //指针到对象sCast1 sc1;//sCast2 sc2 = (sCast2)sc1;  //错误,不能把一个结构类型(对象)转换成其他任何类型(对象)。sCast2 *sc2 = (sCast2*)&sc1;  //指针之间可以互相转换cSon cs00;cFather cf00 = (cFather)cs00;    cFather *cf01 = (cFather*)&cs00;cFather cf10;//cSon cs10 = (cSon)cf10; //错误,不能将父对象转换为子对象cSon *cs11 = (cSon*)&cf10;
}//1.不能把没有继承关系的类之间进行指针转换
//2.不能把对象转换为指针,指针转换为对象;
void test_Static_cast()
{char x = 'a';int y0 = static_cast<int>(x);//int *y3 = static_cast<int*>(x); //错误,对象到指针//int y4 = static_cast<int>(y3); //错误,指针到对象sCast1 sc1;//sCast2 sc2 = static_cast<sCast2>(sc1);  //错误,不能转换//sCast2 *sc2 = static_cast<sCast2*>(&sc1);  //错误,指针之间也不能用static_cast进行转换cSon cs00;cFather cf00 = static_cast<cFather>(cs00);    cFather *cf01 = static_cast<cFather*>(&cs00);cFather cf10;//cSon cs10 = static_cast<cSon>(cf10); //错误,不能将父对象转换为子对象cSon *cs11 = static_cast<cSon*>(&cf10);
}//1.只能用于指针和引用;不能用于对象之间;
//2.内置类型,(一定情况下)可以把对象转换为指针,指针转换为对象;继承关系类之间不可以;
//3.任何自定义类型不可以进行从指针到对象,对象到指针的转换
void test_Reinterpret_cast()
{char x = 'a';int *y = reinterpret_cast<int*>(x); //对象到指针int z = reinterpret_cast<int>(y); //指针到对象sCast1 sc1;//sCast2 sc2 = reinterpret_cast<sCast2>(sc1);  //错误,不能用于对象之间sCast2 *sc2 = reinterpret_cast<sCast2*>(&sc1);  cSon cs00;//cFather cf00 = reinterpret_cast<cFather>(cs00);    //错误,不能用于对象之间cFather *cf01 = reinterpret_cast<cFather*>(&cs00);//cFather *cf02 = reinterpret_cast<cFather*>(cs00);cFather cf10;//cSon cs10 = reinterpret_cast<cSon>(cf10); //错误,不能将父对象转换为子对象cSon *cs11 = reinterpret_cast<cSon*>(&cf10);//cSon *cs12 = reinterpret_cast<cSon*>(cs00); //错误,不能用于自定义对象到指针//cSon cs13 = reinterpret_cast<cSon>(&cs00);  //错误,不能用于自定义指针到对象
}//1. 只能用于继承关系的指针和引用
//2. 只能将子类型指针转换为父类型指针
void test_Dynamic_cast()
{char x = 'a';//int *y = dynamic_cast<int*>(x); //错误,对象到指针//int z = dynamic_cast<int>(y); //错误,指针到对象sCast1 sc1;//sCast2 sc2 = dynamic_cast<sCast2>(sc1);  //sCast2 *sc2 = dynamic_cast<sCast2*>(&sc1);  cSon cs00;//cFather cf00 = dynamic_cast<cFather>(cs00);    cFather *cf01 = dynamic_cast<cFather*>(&cs00);  //只能用于将子类指针转换为父类指针//cFather *cf02 = dynamic_cast<cFather*>(cs00);cFather cf10;//cSon cs10 = dynamic_cast<cSon>(cf10); //cSon *cs11 = dynamic_cast<cSon*>(&cf10);//cSon *cs12 = dynamic_cast<cSon*>(cs00);//cSon cs13 = dynamic_cast<cSon>(&cs00);
}//1. 只能用于指针和引用
//2. 将const指针转化为普通指针,只能用const_cast
void test_Const_cast()
{int a = 1;//int b = const_cast<int>(a); //错误,不能用于对象int *c =  const_cast<int*>(&a);*c = 2;const int *d = &a;  //常量指针//*d = 10;          //常量不能赋值int *e1 = const_cast<int*>(d);         //int *e2 = reinterpret_cast<int*>(d);  //错误, const指针转化为普通指针,只能用const_cast//int *e3 = static_cast<int*>(d);//int *e4 = dynamic_cast<int*>(d);*e1 = 20;cout<<a<<endl;cout<<*e1<<endl;char x = 'a';//int y0 = const_cast<int>(x);//int *y = const_cast<int*>(x); //错误,对象到指针//int z = const_cast<int>(y); //错误,指针到对象sCast1 sc1;sc1.a = 1;sc1.b = 2;//sCast2 sc2 = const_cast<sCast2>(sc1);  //错误,不能转换//sCast2 *sc2 = const_cast<sCast2*>(&sc1);  //错误, cSon cs00;cs00.a = 1;cs00.b = 2;cs00.c = 3;//cFather cf00 = const_cast<cFather>(cs00);    //cFather *cf01 = const_cast<cFather*>(&cs00);//cFather *cf02 = const_cast<cFather*>(cs00);cFather cf10;//cSon cs10 = const_cast<cSon>(cf10); //错误,//cSon *cs11 = const_cast<cSon*>(&cf10);//cSon *cs12 = const_cast<cSon*>(cs00);//cSon cs13 = const_cast<cSon>(&cs00);const sCast1 sc11 = sc1;//sCast2 sc2 = const_cast<sCast2>(sc11);  //错误,不能转换//sCast2 *sc2 = const_cast<sCast2*>(&sc11);  //指针之间也不能用static_cast进行转换  const cSon cs01 = cs00;//cFather cf00 = const_cast<cFather>(cs01);    //cFather *cf01 = const_cast<cFather*>(&cs01);//cFather *cf02 = const_cast<cFather*>(cs01);//const cFather cf11;//cSon cs10 = const_cast<cSon>(cf11); //错误,不能将子对象转换为父对象//cSon *cs11 = const_cast<cSon*>(&cf11);//cSon *cs12 = const_cast<cSon*>(cf11);//cSon cs13 = const_cast<cSon>(&cf11);}int main()
{test_Cstyle();test_Static_cast();test_Reinterpret_cast();test_Dynamic_cast();test_Const_cast();return 1;
}


 

 

这篇关于C++类型强转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558193

相关文章

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的