首页 > 编程语言 >浅谈C++类型转换函数

浅谈C++类型转换函数

时间:2023-12-20 23:02:12浏览次数:38  
标签:类型转换 const 浅谈 int void dynamic C++ cast 指针

  1. reinterpret_cast

reinterpret_cast<new type>(expression)

将一个类型的指针转换为另一个类型的指针,它允许从一个指针转换为整数类型。

void test01() {
	char a = 0;

	int* p = reinterpret_cast<int*>(&a);
	//不安全
}


  1. const_cast

常量const指针与普通指针之间的相互转化。

如果不用const_cast:一般编译器直接报错。

浅谈C++类型转换函数_const_cast

用const_cast之后

void test02() {
	const int a = 4;
	int b = 10;
	//int* p = &a;
	int* p = const_cast<int*>(&a);//可以强制转换,但很危险
	cout<<--p; //可以直接打印出地址;
	*p =  b; //直接抛出异常并中止程序。
}

浅谈C++类型转换函数_dynamic_cast_02

可见还是很危险的。语法生成的时候虽然没报错,但运行说不定就会出错。

  1. static_cast

主要用于基本类型之间的相互转换,和具有继承关系间的类型转换。

一般情况下的基类指针或引用指向子类时

浅谈C++类型转换函数_const_cast_03

用static_cast强制转换。

void test03() {
	A a;
	//B& p = a;

	B& p = static_cast<B&>(a);
	//可以这样转,但是也比较危险
}

浅谈C++类型转换函数_C++强制类型转换_04


  1. dynamic_cast

只有类中有虚函数才能用dynamic_cast

dynamic_cast具有类型检查功能,比static_cast更安全

void test04() {
	try {
		A a;
		B& p = dynamic_cast<B&>(a);
	}
	catch (bad_cast err) {
		cout << err.what() << endl;
	}
}

浅谈C++类型转换函数_reinterpret_cast_05

结果出现Bad dynamic_cast;

总结:C++中提供的四种强制类型转换在一定的特殊情况下可以使用,但各有各的危险。

但,在C++中可以自己实现 自定义转换函数。











下篇更新自定义转换函数


标签:类型转换,const,浅谈,int,void,dynamic,C++,cast,指针
From: https://blog.51cto.com/u_15172160/8911384

相关文章

  • Mysql以及TCP socket的C++代码
    在使用socket编写tcp的C++程序时,遇到了一个问题:那就bind冲突了,分析原因:是因为std中有bind函数,而socket中也有,但是没有报重复定义的错误,这就有一点难办了。百度了一下:发现只要使用::bind就可以调用socket的bind。下面把这个套接字socket的server端代码贴出来:staticvoid*serv......
  • C++系列三:QT代码库
    目录前言QT小记1.菜单栏、工具栏、状态栏2.自定义的对话框3.任务管理器4.链接数据库mysql,sqlite5.WidgetsGalleryExample代码学习:999.ControlsQT-For-Python1.DemoQT-Quick1.HelloWorld2.简单表单前言记录有关qt的案例。QT小记知识点:1.ui_widget.h:类的名称是Ui......
  • 《算法、C++、Linux、Android》
    ......
  • C++引用在本质上是什么,它和指针到底有什么区别?
    参考文章:https://www.bilibili.com/read/cv13541907/对于指针变量P,引用变量Q,以及变量a=10;赋值过程:P=&a;&Q=a;P=&a:将变量a的地址传给指针P。a的地址上存的值是10;P的地址上存值是a的地址;*P:指向的是存在指针P上的地址(a的地址)上的内容,即a的值10。指针P指......
  • C++中的explicit关键字
    一、简介explicit关键字可以阻止隐式转换的发生。举例:C++中只带有一个参数的构造函数,或者或者除了第一个参数外其余参数都有缺省值的多参构造函数,承担了两个角色:(1)用于构建单参数的类对象。(2)隐含的类型转换操作符。一个类A的构造函数A(inti)就是既可以用来作为构造器,......
  • C++聊天集群服务器解决客户端注销登录问题
    客户端如何处理注销登录问题?问题描述:​ 在客户端登录后进行注销选择,然后重新登录刚才注销的账号,直接卡死。注意这是概率发生,因为是主线程和子线程抢服务器发送的信息,只有子线程抢到才会发生卡死问题产生原因分析:​ 前置条件:主线程循环等待用户输入选择(第一张图是死循环,send......
  • 从西工大安全事件浅谈特权账号管理系统
    去年9月,国家计算机应急处理中心发布《西北工业大学遭美国NSA网络入侵事件调查报告(之一)》(以下简称“西工大事件报告”),以充分详实的证据揭示了美国NSA使用41种武器,先后使用了遍布17个国家的54台跳板机和代理服务器,对我国包括西北工业大学等多个重要数据设施网络系统进行了长时间的浸......
  • C++ Qt开发:QItemDelegate 自定义代理组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStyledItemDelegate自定义代理组件的常用方法及灵活运用。在Qt中,QStyledItemDelegate类是用于......
  • Java线程池使用浅谈
    1. 线程池相关基本概念任务(Task):任务是线程池中要执行的工作单元。任务可以是实现了 Runnable 接口或 Callable 接口的对象。Runnable 任务没有返回值,而 Callable 任务可以返回一个结果。线程池管理器(ThreadPoolManager):线程池管理器是用于创建和管理线程池的组件。......
  • C++11 多线程
    文章参考:C++教程|爱编程的大丙(subingwen.cn)C++11的原子量与内存序浅析-兔晓侠-博客园(cnblogs.com)从C++11起,C++为用户提供一套新的多线程类。线程相关操作头文件:thread#include<thread>一.std::thread1.初始化和析构默认构造函数:原型:thread()noexce......