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++新特性06_强制转换const_cast(const、强制转换、内存中?代表不可访问) -> 正文阅读

[C++知识库]C++新特性06_强制转换const_cast(const、强制转换、内存中?代表不可访问)

强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针转换成派生类指针,把一种函数指针转换成另一种函数指针,把常量指针转换成非常量指针等。

1.C语言中强转的方法:

    int n = 1;
	
	//将n的地址赋给指针p
	//int* p = &n;

	//c语言中进行强制转换,将n作为一个地址赋给p
	//p是带有类型的地址
	int* p = (int*)n;

当对地址为1的p进行访问的时候,会报如下错误:

int main()
{
	int n = 1;
	
	//c语言中进行强制转换,将n作为一个地址赋给p
	//p是带有类型的地址
	int* p = (int*)n;

	//代表在地址为1的地方赋值为1
	*p = 1;

	return 0;
}

在这里插入图片描述
基类转换为派生类的问题:由于派生类可能成员更多,基类转换为派生类可能越界访问。
函数指针的问题:由于函数的参数存在差异

2.强制转换运算符
C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:
const_cast、static_cast、reinterpret_cast、dynamic_cast
C语言强制类型转换缺点:
(1)没有从形式上体现转换功能和风险的不同。
(2)将多态基类指针转换成派生类指针时不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象。
(3)难以在程序中寻找到底什么地方进行了强制类型转换。
3.const_cast
仅用于进行去除 const 属性的转换,它也是四个强制类型转换运算符中唯一能够去除 const 属性的运算符。
(1)使用方法:

//<>内为转换的目标,()内为要转换的值
//const_cast只针对指针、引用、this指针

#include <iostream>
#include <string>

int main() {
	const int n = 5;
	const std::string s = "Inception";

	//<>内为转换的目标,()内为要转换的值
	//const_cast只针对指针、引用、this指针
	int* k=const_cast<int*>(&n);//指针
	*k = 123;

	int& kRef = const_cast<int&>(n);//引用
	kRef = 456;

}

下面为利用const_cast进行强制转换,利用指针和引用改变n的值的方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)常成员函数中去除this指针的const属性:

//常成员函数,不能修改成员变量的值
void foo(int nTest) const {}

运行结果如下:
在这里插入图片描述
(3)为什么常成员函数不能修改成员变量的原因:
先复习一下,之前学过的const的使用:

const int* p;//代表指针指向的内容是不变的
int =5;
int* const p=&n;//代表p本身的值(地址)不可以该表
class CTest
{
public:
	CTest() : m_nTest(2) {}
	//常成员函数,不能修改成员变量的值
	void foo(int nTest) const {
		void* p = this;
		//m_nTest = nTest;

		//m_nTest = nTest; 错误
		//const_cast<CTest*>(this)->m_nTest = nTest;
	}

public:
	int m_nTest;
};

int main() {
	CTest t;
	t.foo(1);
}

运行结果如下:
const在类的前面,代表指针指向的内容是不变的,也就是类的成员变量是不可以改变的。
在这里插入图片描述
(4)可以通过以下形式去除类前面的const属性

//<CTest* const>指针地址不可改变,(this)代表常成员函数的this指针
//const_cast去除CTest*前面的const
const_cast<CTest* const>(this)->m_nTest = nTest;

#include <iostream>
#include <string>

class CTest
{
public:
	CTest() : m_nTest(2) {}
	//常成员函数,不能修改成员变量的值
	void foo(int nTest) const {
		//void* p = this;
		//m_nTest = nTest;

		//m_nTest = nTest; 错误

		//<CTest* const>指针地址不可改变,(this)代表常成员函数的this指针
		//const_cast去除CTest*前面的const
		const_cast<CTest* const>(this)->m_nTest = nTest;
	}

public:
	int m_nTest;
};

int main() {
	CTest t;
	t.foo(1);
}

4.学习视频地址:强制转换const_cast
5.学习笔记:强制转换const_cast笔记

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:39:12  更:2021-11-16 18:41:16 
 
开发: 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年11日历 -2024/11/24 6:49:31-

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