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

相关文章

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat