C++技术问题总结-第0篇 类型转换

从今天開始,对C++经常使用技术做个总结。

參考书籍:《C++Primer》、《C++对象模型》、《设计模式》、《Windows核心编程》、《STL解密》。

1. static_cast等四个cast的详细意义

C++类型转换:隐式转换和显式转换。

显式转换:static_cast、dynamic_cast、reinterpret_cast、const_cast。

1.1. static_cast

使用方法:static_cast<type-id>(expression)

说明:该运算符把expression转换为type-id类型,但没有执行时类型检查来保证转换的安全性。

来源:为什么须要static_cast类型强制转换?

(1)void指针->其它类型指针。

(2)改变通常的标准转换。

(3)避免出现可能多种转换的歧义。

几种使用方法:

(1)类层次中基类和子类之间指针或引用的转换。

进行上行转换(把子类的指针或引用转换成基类)是安全的。

进行下行转换(把基类的指针或引用转换成子类)时,因为没有动态类型检查,所以是不安全的。

(2)用于基本数据类型之间的转换,如把int转换成char等。

这样的转换的安全性也要开发者来保证。

(3)把void指针转换成目标类型的指针(不安全)。

(4)把不论什么类型的表达式转换成void类型。

1.2. dynamic_cast

使用方法:dynamic_cast<type-id>(expression)

说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、引用或void*。

将基类类型的指针或引用安全地转换为派生类型的指针或引用。

一次运行两个操作。它首先验证被请求的转换是否有效,仅仅有转换有效,操作符才实际进行转换。

流程图。

来源:为什么须要dynamic_cast?

简单来说,当无法使用virtual函数的时候。不能改动源代码时,才这么干。

在类层次间进行上行转换时,dynamic_cast、static_cast的效果是一样的,在进行下行转换时,dynamic_cast是具有类型检查的功能。

1.3. reinterpret_cast

使用方法:reinterpret_cast<type-id>(expression)

说明:type-id必须是一个指针、引用、算术类型、函数指针或成员指针。

使用方法:它能够把一个指针转换成一个整数,或进行相反操作。

1.4. const_cast

使用方法:const_cast<type-id>(expression)

说明:该运算符用来改动类型的const或volatile属性。

常量指针或引用被转化成很量指针或引用,而且仍然指向原对象。

常量对象被转换成很量对象。

个人理解:个人不经常使用,这个使用方法违反了设计原意。

演示样例:

class B {public: int m_iNum;};
void foo(){
    const B b1;
    b1.m_iNum = 1000;//编译失败,由于b1是常量
    B& b2=const_cast<B&>(b1);
    b2.m_iNum=200;//fine,b1、b2的m_iNum值都为200
}
时间: 2024-10-12 03:25:46

C++技术问题总结-第0篇 类型转换的相关文章

C++技术问题总结-第0篇

从今天开始,对C++常用技术做个总结. 参考书籍:<C++Primer>.<C++对象模型>.<设计模式>.<Windows核心编程>.<STL解密>. 1. static_cast等四个cast的具体意义 C++类型转换:隐式转换和显式转换. 显式转换:static_cast.dynamic_cast.reinterpret_cast.const_cast. 1.1. static_cast 用法:static_cast<type-id&

JAVA技术专题综述之线程篇(1)

本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run()和start() 示例1: public cla ThreadTest extends Thread{public void run(){for(int i=0;i<10;i++){Syste

嵌入式系统 Boot Loader 技术内幕----仅此一篇读懂bootloader

嵌入式系统 Boot Loader 技术内幕----仅此一篇读懂bootloader 本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念.软件设计的主要任务以及结构框架等内容. 1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分. 2. Li

Java图像处理最快技术:ImageJ 学习第一篇

ImageJ是世界上最快的纯Java的图像处理程序.它可以过滤一个2048x2048的图像在0.1秒内(*).这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的ImageJ的开发插件.500多插件可用. 数据类型:8位灰度或索引色,16位无符号整数,32位浮点和RGB色彩. 文件格式:读写所有支持的数据类型为TIFF(非压缩)或原始数据.打开和保存GIF,JPEG,BMP,PNG,PGM,FITS和ASCII.打开DICOM.使用URL打开的TIFF.GIF文件.J

第 0 篇

虽然叫 0 篇,但它不是写得最早的. 只是为了说明,从它开始,算是我正式开始在网上写点东西了. 技术及程序相关的东西,下标从 0 开始算是很正常吧. ------------------------------ 为什么要写博客? 记录下技术的点点滴滴. 我存在过. 随笔. ------------------------------ 声明: 非特别标识,文章内容均属个人原创.如需转载,请注明出处. 如果您认为我的文章内容侵犯了您的版权,请与我取得联系,我将会及时作出处理. 第 0 篇

C++技术问题总结-第2篇 进程通信

进程通信的方法 进程通信基本方法有如下几种. 1.消息传递机制. 2.共享内存. 3.管道和邮槽. 4.剪贴板. 5.Socket通信. 1.消息传递机制 使用WM_COPYDATA实现进程间的传递数据. 函数原型 LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam) 参数 hWnd:其窗口程序将接收消息的窗口的句柄.如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非

C++技术问题总结-第3篇 线程同步

线程同步的方法 线程同步有多种方法. 用户模式下的线程同步:关键段(critcal section). 内核模式下的线程同步:事件.计时器.信号量.互斥量. 1.关键段 用户模式下的同步,主要API如下. InitializeCriticalSection.DeleteCriticalSection.EnterCriticalSection.LeaveCriticalSection. 2.事件 常用于:一个线程初始化工作,然后再触发另一个线程让它工作.主要API如下. CreateEvent.S

C++技术问题总结-第4篇 TCP与UDP

TCP.UDP各自client.server端描述 TCP.UDP位于传输层,基于IP协议. 1.TCP TCP:Transmission Control Protocal 传输控制协议. 服务器与客户端执行流程如下. API说明. 创建套接字:SOCKET localSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 绑定:bind(localSocket, (SOCKADDR*)&servAddr, sizeof(SOCKADDR)); 监

【OAuth2.0】Spring Security OAuth2.0篇之初识

不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握,或者说先用起来(少年,一辈子辣么长,你这么着急合适吗?).好在前人们已经做好了很好的demo,我自己照着抄一抄也就理解了大概如何用,依旧手残党,依旧敲不出好代码.忏悔- WHAT? 项目之中实际使用OAuth2.0实现是用的Spring Security OAuth2.0,一套基于Spring S