C++新特性06_强制转换运算符_const_cast(强制转换运算符:需要类型转换的时候使用,用于用编译器实现检测;const_cast:仅用于进行去除const 属性的转换;内存中?代表不可访问)

36 篇文章 23 订阅
订阅专栏

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

1.C语言中强转的方法及问题

1.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;
}

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

1.2 C语言强制类型转换缺点

主要是为了克服C语言强制类型转换的以下三个缺点。

  • 没有从形式上体现转换功能和风险的不同。

    例如,将 int 强制转换成 double 是没有风险的,而将常量指针转换成非常量指针,将基类指针转换成派生类指针都是高风险的,而且后两者带来的风险不同(即可能引发不同种类的错误),C语言的强制类型转换形式对这些不同并不加以区分。

  • 将多态基类指针转换成派生类指针时不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象。

  • 难以在程序中寻找到底什么地方进行了强制类型转换。

    强制类型转换是引发程序运行时错误的一个原因,因此在程序出错时,可能就会想到是不是有哪些强制类型转换出了问题。

2. 强制转换运算符

C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:

  • const_cast

  • static_cast

  • reinterpret_cast 较少使用

  • dynamic_cast 虚函数中用的比较多

利用C++提供的运算符,就可以从编译器的角度上,最大的去支持检测安全性,鲁棒性更强。

3.const_cast

仅用于进行去除 const 属性的转换,它也是四个强制类型转换运算符中唯一能够去除 const 属性的运算符。

3.1 常用方法:利用const_cast 转换为同类型的非 const 引用或者指针

  • <>内为转换的目标,()内为要转换的值
  • 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的值的方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 常成员函数中去除this指针的const属性

3.2.1 常成员函数不能修改成员变量的值

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

运行结果如下:
在这里插入图片描述

3.2.2 为什么常成员函数不能修改成员变量的原因

先复习一下,之前学过的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在类的前面,代表指针指向的内容是不变的,也就是类的成员变量是不可以改变的。
在这里插入图片描述

3.2.3 可以通过const_cast去除类前面的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++const_cast与reinterpret_cast运算符的用法
01-01
const_cast 运算符 从类移除 const、volatile 和 __unaligned 特性。 语法 const_cast < type-id > ( expression ) 备注 指向任何对象类型的指针或指向数据成员的指针可显式转换为完全相同的类型(const、volatile 和 __unaligned 限定符除外)。对于指针和引用,结果将引用原始对象。对于指向数据成员的指针,结果将引用与指向数据成员的原始(未强制转换)的指针相同的成员。根据引用对象的类型,通过生成的指针、引用或指向数据成员的指针的写入操作可能产生未定义的行为。 您不能使用 const_cast 运算
C++const用法全解
04-12
constC++占有重要作用,属于小兵立大功的典型,本文档详细介绍了如何使用const
const_cast
最新发布
weixin_39291964的博客
03-23 172
因此,在确实必要,且明确知道自己在做什么的情况下,才使用属性并修改变量的值,虽然在技术上是可行的,但在逻辑上可能是不安全的。关键字表示变量的值不应该被改变,直接修改这样的变量会导致编译错误。通常,在编程过程,我们可能会遇到需要修改一个被声明为。然而,需要强调的是,这种做法应该非常谨慎地使用属性的目标类型,而“表达式”则是指向原始数据的指针或引用。进行修改,可能会导致程序行为的不可预测性和潜在的错误。是C++的一个类型转换运算符,专门用于去除变量的。的指针,你希望能够通过这个指针修改所指向的。
C++const_cast
u014209688的专栏
07-09 1180
const_cast是一个运算符,和dynamic_cast、static_cast、reinterpret_cast一样都是用于类型的转换的,本来想将这四个一起写的,但是查了const_cast相关的资料,发现const_cast可以牵扯到的也不少,所以单独用一篇博客说明了。 1. 用法 const_cast的作用很简单,就是去除或增加类型const属性或volatil...
C++标准转换运算符const_cast
weixin_30752377的博客
07-22 263
前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述。C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymorphism)”。 要想很好的使用多态性,就免不了要使用指针和引用,也免不了会碰到转换的问题,所以在这一篇,就把导师讲的以及在网上反复查阅了解的知识总结一下。 C++提供了四个转换运算符: ...
const_cast 的作用
写写画画
12-25 754
原:百度百科 该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。 一、常量指针被转化成非常量的指针,并且仍然指向原来的对象; 二、常量引用被转换成非常量的引用,并且仍然指向原来的对象; volatile和const类似。举如下一例: 1
C++ const_cast
Tokyo_2024的博客
03-26 180
1. const_cast主要用于const变量改变属性为非const,便于临时对其值进行改变;2. 但是,尽量应该不要用,比如上面函数,函数声明里面已经时const修饰,reviewer从const这个关键字就以为内部不会被修改,但是,在函数内部又对其进行了修改,这是一种非常不好的编码风格;...
Thinking_in_C++_文版【高清+可搜索+可编辑/复制/粘贴+无密码】
05-02
可以用运算符“= =”和“!=”来互相比较这些对象。也可以用n a m e ( )来 获得类型的名称。注意,如果给t y p e i d ( )传递一个s h a p e *型参数,它会认为类型为s h a p e *,所以如 果想知道一个指针所指对象的...
C++ RTTI的使用方法详解
12-31
这是新添加到c++的特性之一,很多老式实现不支持。另一些实现可能包含开关RTTI的编译器设置。RTTI旨在为程序在运行阶段确定对象类型提供一种标准方式。很多类库已经成为其父类对象提供了实现这种方式的功能。但...
新手学习C++入门资料
12-28
有时候,根据表达式的需要,某个数据需要被当成另外的数据类型来处理,这时,就需要强制编译器把变量或常数由声明时的类型转换需要的类型。为此,就要使用强制类型转换说明,格式如下: int* iptr=(int*) &...
深度探索C++对象模型 超清版
01-08
1.1 C++模式模式(The C++ Object Model) 简单对象模型(A Simple Object Model) 表格驱动对象模型(A Table-driven Object Model) C++对象模型(Th e C++ Object Model) 对象模型如何影响程序(How the Object ...
深度探索模C++对象模型PDF
12-28
1.1 C++模式模式(The C++ Object Model) 简单对象模型(A Simple Object Model) 表格驱动对象模型(A Table-driven Object Model) C++对象模型(Th e C++ Object Model) 对象模型如何影响程序(How the Object ...
C++const_cast
little_startoo的博客
05-26 523
C++const_cast
C++const_cast的问题
*无名小卒*
03-29 7663
和上一篇文章一样了,还是提起一下大约一年前我来公司面试所遇到的一道题目,题目很简单:C++有多少种cast,它们的名称和功能各是什么。(我之前的文章曾经提到过,但后来我发现自己写得并不够简明)答案如下: 一共四种cast。1、static_cast,支持子类指针到父类指针的转换,并根据实际情况调整指针的值,反过来也支持,但会给出编译警告,它作用最类似C风格的“强制转换”,一般来说可认为它是
C++ const_cast用法
热门推荐
TH_NUM的博客
08-06 1万+
const_cast是一种C++运算符,主要是用来去除复合类型const和volatile属性(没有真正去除)。 变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。 用法:const_cast(expression) 通过const_cast运算符,也只能将const type*转换为type*,将const type&amp...
C++ const_cast解释
Zyong139064359的博客
03-26 636
今天看到C++类型转换,遇到一些问题,于是上网查了一些资料 做了一些总结.#include<iostream> using namespace std; struct A{ int data; }; int main(void){ const A a={200}; //A a1=const_cast<A>(a); //a1.data=300; //目标类型只能是指针或者引...
C++const_cast的用法
dddgggd的博客
03-04 968
C++规则的设计目标之一是,保证“类型错误”绝对不可能发生,理论上如果你的程序很“干净”的通过编译,就表示它并不企图在任何对象上执行任何不安全、无意义、愚蠢荒谬的操作。这是一个极具价值的保证,可别草率的放弃它。
c++ 的四种强制转换包括:static_cast, dynamic_cast, const_cast, reinterpret_ca
04-28
C++的四种强制类型转换分别是static_cast、dynamic_cast、const_cast和reinterpret_cast。 1、static_cast: static_cast用于基本数据类型之间、同一继承层次的类型之间以及基本数据类型和同一继承层次的类型之间的转换转换时会进行类型检查,不能进行不安全的类型转换。 2、dynamic_cast: dynamic_cast用于不同继承层次之间的类型转换转换时会进行类型检查,若转换失败则返回空指针或抛出异常。 3、const_cast: const_cast用于将常量转换成非常量,或将指向常量的指针转换成指向非常量的指针。const_cast只能用于指针或引用的类型转换,不能用于基本数据类型之间的类型转换。 4、reinterpret_cast: reinterpret_cast用于进行二进制转换,主要用于指针或引用之间的类型转换。这种类型转换非常不安全,可能会出现未知的行为,应该尽量避免使用。 总的来说,四种强制类型转换都应谨慎使用。在进行类型转换时,应尽可能使用更安全的方法,避免出现潜在的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Qt工程实践_01_Qt样式表Qss(什么是QSS;基本语法;setStyleSheet函数;样式表的属性值;利用QtCreate实现样式切换;样式表实现皮肤改变实例) 23011
  • 找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决 13640
  • QT控件自适应窗口变化 12566
  • matlab实现cell中数据保存为excel文件 9377
  • Qt中.pro.pri的配置详解:指定包含文件,输出目录 ($$PWD文件当前目录、$$join(TARGET,,,_d))deb或rele版本下生成的文件加_d后缀、message($$PWD)) 9067

分类专栏

  • Qt工程架构及工程实践 付费 9篇
  • C++设计模式 付费 26篇
  • c#入门详解 付费 9篇
  • C语言基础入门48篇 51篇
  • C++ 17篇
  • C++57个入门知识点 60篇
  • C++新特性37篇 36篇
  • C++数据结构X篇 25篇
  • Qt 16篇
  • QT从入门到实战x篇 33篇
  • Qt 5.9 C++开发指南 51篇
  • Qt中的Json操作X篇 3篇
  • Qt-pro、pri、prf、prl详解 4篇
  • Qt项目实例
  • Python 4篇
  • 掌握Python的X篇 36篇
  • Python实战
  • 算法 2篇
  • 数据库 2篇
  • MySQL 22篇
  • 计算机科学速成 3篇
  • TCP/IP 2篇
  • linux使用及开发 2篇
  • Linux系统基础及系统编程 11篇
  • 嵌入式Linux Qt5(C++)开发 8篇
  • SVN及git使用 4篇
  • OpenGL
  • 工业自动化
  • ModBus通信从入门到精通 2篇
  • OPC通信从入门到精通 2篇
  • 人工智能
  • Matlab程序编写 2篇
  • tcl基础知识 1篇
  • VS2017常用知识点 4篇
  • 电脑系统及操作 5篇

最新评论

  • 找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决

    烤鸡kaoji: 四个方法 都没用 重装也没用

  • 掌握Python的X篇_4+5_开发工具ipython与vscode的安装使用,作业

    普通网友: 学到了!我也写了一篇获取【大厂面试真题解析、核心开发学习笔记、最新全套讲解视频、实战项目源码讲义、学习路线简历模板】的文章

  • 找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决

    2401_84391571: 你解决了吗,我也这样表情包表情包

  • C++新特性09_强制转换reinterpret_cast(等价于C中的显式强转;增加了代码的可读性;用于进行各种不同类型的转换;编译期处理,执行的是逐字节复制的操作,运行期不进行检查;一般不使用)

    十月旧城: 感谢老哥,已经改了

  • C++新特性09_强制转换reinterpret_cast(等价于C中的显式强转;增加了代码的可读性;用于进行各种不同类型的转换;编译期处理,执行的是逐字节复制的操作,运行期不进行检查;一般不使用)

    永远的i: 哥哥,你这个写错了, int* p = reinterpret_cast<int*>(&n); 不然传入n为非法地址0x01;

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • QT从入门到实战x篇_22_番外1_Qt事件系统
  • 03-1_Qt 5.9 C++开发指南_番外1_QWidget项目默认代码解析(Qt对象模型:对象树与元对象系统;初始化列表用于调用父类有参构造和初始化)
  • C#入门详解_07_详解类型、变量与对象下(C#类型系统:Object、引用类型:类/接口/委托、值类型:结构体/枚举;引用类型变量与实例的关系:引用类型变量里存储的数据是对象的内存地址;装箱与拆箱)
2024年16篇
2023年189篇
2022年88篇
2021年149篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源魔兽rpg防守地图排行榜沈阳市卫生局局长诗歌 起名字2018年龙宝宝起名景字起名字男孩魔法先生ova春夏从港综签到成为传说王立群读宋史国学大师取名起名大全炸鸡店起名有创意睿起什么名字好叶子宇我爱麦当劳茅台客网丁俊晖apple惠普1020打印机驱动官方下载不败战神杨辰秦惜七彩泡泡宋词起名的 女孩名字徐李姓起名大全男孩前任3下载给闺女起个洋气的的小名大全飞单小说叶辰夏若雪全文免费阅读起名旅游宋词起名 女孩什么名字取名起名大全四个字的李姝什么起名王婿叶凡魔兽争霸全图作弊器淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化