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++新特性(二)

强制类型转换运算符:

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

C语言强制类型转换的缺点:

  • 转换太过随意,可以在任意类型之间转换。
    如,将int转double是没有风险的,而将const指针转非const指针,基类指针转派生类指针都是高风险。
  • 没有统一的关键字和标示符。对于大型系统,做代码排查时容易遗漏和忽略。
  • 将多态基类指针转换成派生类指针时不检查安全性。

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

  • const_cast
  • static_cast
  • dynamic_cast
  • reinterpret_cast

1. const_cast - 去const属性

去掉类型的const或者volatile属性。只针对指针,引用,包括this指针
用例:
const成员函数中(函数声明后加const, 表示该函数不能修改成员变量的值),去除this指针的常成员属性。示例:

const int val = 10;
int  &v= const_cast <int&> (val); // 用于引用。
int  *p = const_cast <int*> (&val);  // 用于指针 

//用于去成员函数const属性
class CTest
{
public:
	 int a;
	 void foo(int val) const
	 {	 	
	 	//this->a = val;//非法,常成员函数不能修改成员变量的值。	 	/*this指针其实是 const CTest*const this
	 	可以使用const_cast关键字去除this指针前面的const属性。*/
	 	const_cast<CTest*const>(this)->a = val; //仅去掉指针前面的const属性,允许指针指向的内容被修改。合法
	 	const_cast<CTest*>(this)->a = val; //掉指针全部const属性,允许指针指向的内容和指针被修改。编译合法,但是最后不要修改this.
	 	return a;
	 };
	
}

tips:

//常量指针:const在*前面
const int *a; int const *a;//a指向的内容不变,指针指向的内容是常量,*a=123;// 非法

//指针常量:const在*后面
int *const a;//a不能重新指向新的地址,指针是常量 a=&b;// 非法

2.static_cast — 用来明确隐式转换,多用于基本数据类型转换

类似C风格的强制类型转换,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。

  • 可以用于基类和子类之间的转换
    子类指针转父类是安全
    父类转子类指针是不安全的(建议用dynamic_cast)
  • 用于基本数据类型转换,enum,struct,int,char,float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
  • 把任何类型的表达式转换成void类型。
  • static_cast不能去掉类型的const、volatile属性(要用const_cast)

3.dynamic_cast: – 仅用在多态 (依赖RTTI, 有额外的开销)

dynamic_cast用于具有虚函数的基类派生类之间的指针或引用的转换。
基类必须具备虚函数
原因:dynamic_cast是运行时类型检查,需要运行时的类型信息(RTTI,run time type identify),而这个信息和类的虚函数表关系紧密。
如果没有,编译不通过,会提示不是多态类型
dynamic_cast 是通过“运行时类型检查”来保证安全性的,对于不安全的指针转换,转换结果返回 NULL 。不能用于将非多态基类的指针或引用强制转换为派生类的指针或引用——这种转换没法保证安全性,可用 reinterpret_cast 来完成。
常见的转换方式:

  • 基类指针或引用转成派生类指针或引用(必须使用dynamic_cast)。
  • 派生类指针或引用转成基类指针或引用(可以使用dynamic_cast,但是更推荐static_cast,节省资源

要点:

  • 相同基类不同子类之前的交叉转换,结果返回NULL。因此,可以通过返回值是否是NULl来确定具体的子类类型。
  • 运行时才能知道是否转换成功。
  • 非必要,不使用dynamic_cast,有额外的函数开销。

4.reinterpret_cast 强制转换(类似C显式强转)

reinterpret_cast 用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。转换时,执行的是逐个比特复制的操作

  • 仅重新解释类型,但没有进行二进制的转换:
  • 在比特级别上进行转换,可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。
  • 最普通的用途就是在函数指针类型之间进行转换。
  • 很难保证移植性。
  • 编译器处理,执行的是逐字节复制的操作。
  • 类似于显式类型转换,后果自负。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:43:52  更:2022-03-06 12:47:00 
 
开发: 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 4:52:28-

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