IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++的四种强制转换 -> 正文阅读

[C++知识库]C++的四种强制转换

1.static_cast

基本等价于隐式转换的一种类型转换运算符,以前是编译器自动隐式转换,static_cast可使用于需要明确隐式转换的地方。c++中用static_cast用来表示明确的转换。
可以用于低风险的转换:
整型和浮点型

字符与整形

转换运算符

空指针转换为任何目标类型的指针

不可以用与风险较高的转换:
不同类型的指针之间互相转换
整型和指针之间的互相转换
不同类型的引用之间的转换

2.const_cast

const_cast的对象类型必须为指针引用或指向对象的指针
用法1:

int main()
{
	const int a = 1;
	int*b = const_cast<int*>(&a);
	*b = 5;
	std::cout << a;
}

断点查看运行到*b = 5;时a的值被设为5了,但最后cout的a的值仍然为1
why?

对于const数据我们更要这样保证:绝对不对const数据进行重新赋值。
如果我们不想修改const变量的值,那我们又为什么要去const呢?

原因是,我们可能调用了一个参数不是const的函数,而我们要传进去的实际参数却是const的,但是我们知道这个函数是不会对参数做修改的。于是我们就需要使用const_cast去除const限定,以便函数能够接受这个实际参数。

用法2:

class father
{
	virtual void func()const
	{
	void* p = this;
	}
	int aa;
};

func()为常成员函数,即通过该函数不可修改类的成员变量
在这里插入图片描述
常成员函数的this指针为const xxx型,即指向的地方的数据不能变,于是使用const_cast:

class father
{public:
	virtual void func()const
	{
		const_cast<father*>(this)->aa = 1;
	}
	int aa;
};

现在可以有针对的修改其中的成员

3.dynamic_cast

定义两个简单的类:

class father
{
};
class son:public father
{
public:
	int num;
};

将父类指针转换为子类指针:

int main()
{
	father f1;
	son s1;
	father* pfather=&f1;
	son* pson = &s1;
	son* pson = pfather;
}

在这里插入图片描述
此时pson虽然为子类指针,但他实际指向的是父类对象的空间,编译器认为可能通过该指针访问到此空间中不存在的部分,因此编译不能通过。

因此使用dynamic_cast(动态转换)通过RTTI(运行时类型识别)来做转换,而RTTI通过虚函数来实现,因此在父类里添加一个虚函数:

class father
{
	virtual void func() {};
};

此时再做转换,即使访问了不存在的对象在编译阶段将不会出错:

int main()
{
	father f1;
	son s1;
	father* pfather=&f1;
	son* pson = &s1;
    pson = dynamic_cast<son*>(pfather);
    pson->num = 1;
}

而是在运行阶段时报错,并将pson置为空:
在这里插入图片描述
于是可以这样修改主函数:

int main()
{
	father f1;
	son s1;
	father* pfather=&f1;
	son* pson = &s1;
    pson = dynamic_cast<son*>(pfather);
	if(pson!=nullptr)
	pson->num = 1;
}

若pson在程序运行时指向的为子类空间,则可以修改num,若指向的为父类空间,则也不会报错,更加灵活。

4.reinterpret_cast重新诠释

执行各种高风险转换,如整型转指针,各种类型的指针转换,父类子类指针的转换

int i=1;
int*a=reinterpret_cast(int*)i;

等价于c中的强制转换:

int i=1;
int*a=(int*)i;
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 11:55:13  更:2022-04-29 11:55:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 21:56:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码