Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >一文讲全C++中类型转换操作符

一文讲全C++中类型转换操作符

作者头像
程序员的园
发布于 2024-07-18 05:25:23
发布于 2024-07-18 05:25:23
9500
代码可运行
举报
运行总次数:0
代码可运行

类型转换是C++中一种非常常见的操作,为了保证类型转换的安全性和有效性,C++提出了四种类型转换操作符,通常称之为常规转换操作符。在共享指针出来后,为实现共享指针的转换,提出共享指针支持的四种转换操作符。

常规类型转换操作符

忏悔转换操作符由如下四种:static_cast、dynamic_cast、const_cast和reinterpret_cast。每种转换操作符尤其特定的适用场景。

static_cast

static_cast是一种编译期转换,在编译时进行类型检查并执行类型转换。它主要用于以下几种情况:

  • 用于较明显的类型转换,例如基本数据类型之间的转换。
  • 用于向上转型(Upcasting)和向下转型(Downcasting)之间的转换,但不进行运行时类型检查。
  • 用于将指针或引用从派生类转换为基类。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int num = 10;
double convertedNum = static_cast<double>(num);

Base* basePtr = newDerived();
Derived* derivedPtr = static_cast<Derived*>(basePtr);

dynamic_cast

dynamic_cast是一种运行时转换,在运行时进行类型检查并执行类型转换。它主要用于以下几种情况:

  • 用于多态类型之间的向上转型和向下转型,并进行安全的运行时类型检查。
  • 当转换的目标类型为指针时,如果转换失败,dynamic_cast会返回空指针;当转换的目标类型为引用时,如果转换失败,dynamic_cast会抛出异常。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Base* basePtr = newDerived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);

if (derivedPtr) {
    // 转换成功
} else {
    // 转换失败
}

const_cast

const_cast用于添加或移除指针或引用的const或volatile修饰符。它主要用于以下几种情况:

  • 用于将const或volatile指针或引用转换为非const或非volatile。
  • 用于解除对象的const限制,以便在其上进行修改操作。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
constint num = 10;
int& ref = const_cast<int&>(num);
ref = 20; // 合法,虽然num为const,但通过const_cast修改了引用

int a =10;
volatileint* p = &a;
auto  b = const_cast<int*>(p);

reinterpret_cast

reinterpret_cast是一种比较底层的转换,主要用于不同类型之间的强制转换,不进行类型检查,可能会导致未定义的行为。它主要用于以下几种情况:

  • 用于将一个指针类型转换为另一种不兼容的指针类型。
  • 用于将指针类型转换为整数类型或整数类型转换为指针类型,但需要注意平台相关性和安全性。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int num = 10;
double* ptr = reinterpret_cast<double*>(&num);

共享指针转换操作符

共享指针std::shared_ptr支持的类型转换操作符:std::static_pointer_cast、std::dynamic_pointer_cast、std::const_pointer_cast、std::reinterpret_pointer_cast,这四种共享指针的类型转换操作符和常规类型转换操作符一一对应,难道他们之间有什么关联吗,show me the code

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//msvc源码,有删减
_EXPORT_STD template <class _Ty1, class _Ty2>
_NODISCARD shared_ptr<_Ty1> static_pointer_cast(const shared_ptr<_Ty2>& _Other) noexcept {
    // static_cast for shared_ptr that properly respects the reference count control block
    const auto _Ptr = static_cast<typename shared_ptr<_Ty1>::element_type*>(_Other.get());
    return shared_ptr<_Ty1>(_Other, _Ptr);
}

_EXPORT_STD template <class _Ty1, class _Ty2>
_NODISCARD shared_ptr<_Ty1> const_pointer_cast(const shared_ptr<_Ty2>& _Other) noexcept {
    // const_cast for shared_ptr that properly respects the reference count control block
    const auto _Ptr = const_cast<typename shared_ptr<_Ty1>::element_type*>(_Other.get());
    return shared_ptr<_Ty1>(_Other, _Ptr);
}

_EXPORT_STD template <class _Ty1, class _Ty2>
_NODISCARD shared_ptr<_Ty1> reinterpret_pointer_cast(const shared_ptr<_Ty2>& _Other) noexcept {
    // reinterpret_cast for shared_ptr that properly respects the reference count control block
    const auto _Ptr = reinterpret_cast<typename shared_ptr<_Ty1>::element_type*>(_Other.get());
    return shared_ptr<_Ty1>(_Other, _Ptr);
}

_EXPORT_STD template <class _Ty1, class _Ty2>
_NODISCARD shared_ptr<_Ty1> dynamic_pointer_cast(const shared_ptr<_Ty2>& _Other) noexcept {
    // dynamic_cast for shared_ptr that properly respects the reference count control block
    const auto _Ptr = dynamic_cast<typename shared_ptr<_Ty1>::element_type*>(_Other.get());

    if (_Ptr) {
        return shared_ptr<_Ty1>(_Other, _Ptr);
    }

    return {};
}

由以上代码可知,共享指针支持的类型转换实则是一层封装,当且仅当裸指针支持对应的类型转换时,方可实现共享指针的类型转换。

基于此,共享指针的类型转换操作符与规指针类型转换操作的符的适用场景、注意事项相同,

总结

在C++中,类型转换操作符各具特点且各自有自己的适用场景,应根据实际情况选择合适的转换方式。为确保代码的正确性和安全性应合理使用这些转换操作符,应注意类型的兼容性和转换的安全性,避免导致未定义的行为和潜在的错误。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++中的提供的四种类型转换方式;
在日常的代码编写中,我们经常会遇到有意识和没有意识的类型转换,而直接用C语言提供的强行转换或者干脆是没有意识的隐式类型转换是不安全的,且容易造成一些难以排除的错误。
薄荷冰
2024/11/08
830
C++转型操作符 VS 强制类型转换:为何前者更胜一筹?
码事漫谈
2025/01/18
860
C++转型操作符 VS 强制类型转换:为何前者更胜一筹?
【C++】类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。
YoungMLet
2024/03/01
1180
【C++】类型转换
【c++】类型转换
类型相近的才能发生隐式类型转换,如int和double,如果不相关,而对于指针和整型,指针是地址,整型和指针类型之间不会进行隐式类型转换,只能显式的强制类型转换:
平凡的人1
2023/10/15
2190
【c++】类型转换
C++类型转换
允许将任何指针类型转换为其它的指针类型;听起来很强大,但是也很不靠谱。它主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,在实际开发中,先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原来的指针值;特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。
用户2929716
2018/08/23
7270
C++类型转换
【C++航海王:追寻罗杰的编程之路】C++的类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转换,C语言中总共有两种形式的类型转换:
枫叶丹
2024/06/04
1280
【C++航海王:追寻罗杰的编程之路】C++的类型转换
C++的类型转换
在C语言中,如果等号两边的类型不一样,或者形参和实参的类型不匹配,或者函数返回值与接收的变量类型不同,就会发生类型转换。C语言中存在两种类型转换:隐式类型转换和显示类型转换。
小灵蛇
2024/06/06
1140
C++的类型转换
C++引入的四种类型转换方式
Linux兵工厂
2024/03/18
1210
C++引入的四种类型转换方式
【C++】深究类型转换
如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,转换的前提是类型之间有一定的关联。
_小羊_
2024/11/19
890
【C++】深究类型转换
C++中的四种类型转换运算符
隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。
芯动大师
2023/09/20
3010
C++中的四种类型转换运算符
C++11类型转换
但是上边的代码会出现一个问题,就是运行结果显示,a还是2,不过当我们打开监视窗口可以看到a其实已经被改成3了,这是什么原因呢?
芝士就是菜
2023/04/20
4000
C++11类型转换
C/C++数据类型的转换之终极无惑
数据类型在编程中经常遇到,虽然可能存在风险,但我们却乐此不疲的进行数据类型的转换。
恋喵大鲤鱼
2018/08/03
7340
现代C++之手写智能指针
这个类可以完成智能指针的最基本的功能:对超出作用域的对象进行释放。但它缺了点东 西:
公众号guangcity
2019/12/30
3K0
现代C++之手写智能指针
全面盘点C++类型转换
首先抛出一个面试问题,Type Conversion与Type Casting一样?
公众号guangcity
2023/12/06
4530
全面盘点C++类型转换
【C++】类型转换 ① ( C 中的类型转换 | C++ 类型转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast )
C 语言中 , 类型转换 是常用操作 , 借助该机制 , 将不同数据 的 数据类型 进行转换 ;
韩曙亮
2023/11/27
2290
【C++】类型转换 ① ( C 中的类型转换 | C++ 类型转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast )
【C++高阶】C++类型转换全攻略:深入理解并高效应用
前言:在C++的浩瀚宇宙中,类型转换作为连接不同类型数据之间的桥梁,扮演着至关重要的角色。它不仅关乎程序的正确性与效率,更是深入理解C++语言特性的重要一环。随着C++语言的不断演进,类型转换的规则与技巧也日益丰富和复杂,为开发者提供了强大的灵活性和表达力
Eternity._
2024/09/18
1150
【C++高阶】C++类型转换全攻略:深入理解并高效应用
C++的类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型 转换和显式类型转换。
ljw695
2024/10/18
730
C++的类型转换
【C++】类型转换
在 C 语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化 , C 语言中总共有两种形式的类型转换: 隐式类型 转换和显式类型转换 。
青衫哥
2023/10/17
1720
【C++】类型转换
【c++】智能指针详解&&c++特殊类设计&&c++的类型转换
下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题
用户10925563
2024/08/06
1930
【c++】智能指针详解&&c++特殊类设计&&c++的类型转换
你该知道的C++四种显式类型转换
在C语言中,我们需要做类型转换时,常常就是简单粗暴,在C++中也可以用C式强制类型转换,但是C++有它自己的一套类型转换方式。
编程珠玑
2019/10/28
1.9K0
相关推荐
C++中的提供的四种类型转换方式;
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文