C++四种类型转换总结

C++四种类型转换总结

目的:

C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么,程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。

  1. 细化转换类型
  2. 提供安全性检测
  3. 在代码中更加醒目
    在这里插入图片描述

隐式转换:

类型转换:如果两种类型可以互相转换,那么他们就是关联的。(c++primer P141)
隐式转换:int ival = 3.541 + 3;算术类型之间的隐式转换被设计得尽可能避免损失精度。上式中3转为double类型。加法运算得到的double类型的结果转换为int类型的值,然后用来初始化ival
1.算术转换
把一种算术类型转换成另外一种算术类型,算术转换的规则定义了一套类型转换的层次,其中运算符的运算对象将转换成最宽的类型。
2.其他隐式类型转换
数组转为指针、指针的转换…

1. static_cast

static_cast (expression)
l 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
2 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
3 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
4 用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要开发人员来保证。
任何具有明确定义的类型转换,只要不包含底层const(指针指向的为常量),都可使用static_cast。
可进行基础数据类型转换,父与子类型转换,无父子关系的自定义类型不能转
总结: 1.基本数据类型之间的转换
2.基类和子类之间指针和引用的转换(上行转换是安全的)

2. const_cast

const_cast主要作用是移除类型的const属性,只能改变运算对象的底层cosnt
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;
const(a) = 11; // 注意:<>里面不能用在基本类型,只能用在指针、引用、类对象
注意:不能直接对非指针和非引用的变量使用const_cast操作符去直接移除它的const.
对于将常量对象转换为非常量对象的行为,一般称为去掉const性质

	const int* p = NULL;(底层constint* np = const_cast<int*>(p);
	const int a = 10;  //不能对非指针或非引用进行转换
	//int b = const_cast<int>(a);

基本类型常量,因为存在常量展开的情况,const_cast<>并不会改变后面的值

const int a = 10;
cout << "a:" << a << endl;
const_cast<int&>(a) = 11; // 已经改变a所在内存的值
cout << "a:" << a << endl; // 常量展开,看不到改变
cout << "*(&a)" << *(&a) << endl; // 直接访问内存可以看到改变 
int *p = &a;
cout << "*p:" << *p << endl; // 直接访问内存可以看到改变

在const成员函数中修改成员变量(3种方法):
在const函数中所有成员变量都是const
在const函数中this指针是const类型,所以所有成员不能被直接改变
方法1:用const_cast<>()把需要修改的成员变量转成非const类型
方法2:用const_cast<>()把this转换成非const类型,然后修改成员变量
方法3:在需要修改的成员变量声明前加上关键字mutable。

3. dynamic_cast

dynamic_cast (expression)。
dynamic_cast主要用于类层次间的上行转换和下行转换;
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全;
用于将父类的指针或引用安全地转换成子类的指针或引用,基础类型不可以转换,失去精度或不安全都不可转
使用条件:
下行转换,把父类指针转换成子类指针。
1.父类指针必须指向当前类型的子类对象
2.必须有多态(有虚函数)

dynamic_cast特点如下:

(1)其他三种都是编译时完成的,dynamic_cast 是运行时处理的,运行时要进行类型检查。
  (2)不能用于内置的基本数据类型的强制转换
  (3)dynamic_cast 要求 <> 内所描述的目标类型必须为指针或引用。dynamic_cast 转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回 nullptr
  (4)在类的转换时,在类层次间进行上行转换(子类指针指向父类指针)时,dynamic_cast 和 static_cast 的效果是一样的。在进行下行转换(父类指针转化为子类指针)时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全。 向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。在C++中,编译期的类型转换有可能会在运行时出现错误,特别是涉及到类对象的指针或引用操作时,更容易产生错误。Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试。
  (5)使用 dynamic_cast 进行转换的,基类中一定要有虚函数,否则编译不通过(类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义)。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表。

4. reinterpret_cast

主要有三种强制转换用途:
  1、改变指针或引用的类型
  2、将指针或引用转换为一个足够长度的整形
  3、将整型转换为指针或引用类型。
  用法为 reinterpret_cast (expression)。
  type-id 必须是一个指针、引用、算术类型、函数针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,有四种强制类型转换操作符,分别是const_cast、dynamic_cast、reinterpret_cast和static_cast。这些转换类型适用于不同的目的。const_cast主要用于强制取消对象的常量性,它是唯一能够做到这一点的操作符。dynamic_cast主要用于在运行时进行安全的类型转换,它可以在继承关系中进行向下转型,并且会进行安全检查以确保类型转换的有效性。reinterpret_cast用于进行底层的位级转换,它可以将一种类型的指针转换为另一种类型的指针,但是需要谨慎使用,因为它可能会导致未定义行为。static_cast是一种通用的类型转换操作符,它可以进行标准的类型转换,例如将整数类型转换为浮点数类型,或者将指针类型转换为另一种指针类型。总之,C语言中的这四种强制类型转换操作符提供了灵活的类型转换能力,但需要根据具体的需求来选择合适的操作符。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++四种强制类型转换](https://blog.csdn.net/challenglistic/article/details/128882220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [深入C++四种强制类型转换总结](https://download.csdn.net/download/weixin_38723192/14866840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值