注:原创不易,转载请务必注明原作者和出处,感谢支持!

注:内容来自某培训课程,不一定完全正确!

一 类型转换

类型转换的含义是通过改变一个变量的类型为别的类型从而改变变量的表示方式。C++提供了4种类型转换操作符来应对不同场合的类型转换。

语法 适用场景
static_cast 一般的转换(比如C++内建类型之间的转换)
dynamic_cast 通常在基类和派生类之间转换时使用
const_cast 主要针对const的转换
reinterpret_cast 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整型数



总结:

(1)static_cast用于内置数据类型,具有继承关系的指针或者引用的转换。

(2)dynamic_cast只能转换具有继承关系的指针或者引用,并且只能由子类型转成父类型(基类型)。在具有基础关系的指针或者引用的转换上,相较于static_cast,dynamic_cast,添加了额外的安全检查,拒绝了类型不安全的转换,更加地安全。

(3)const_cast用来给基础数据类型,指针或者引用“加上”或者“去除”const

(4)reinterpret_cast用于任意两个无关类型的指针或者引用的转换

有关C++类型转换的一个详细案例如下所示。


class Building {};
class Animal {};
class Cat : public Animal {}; void Test1()
{
// static_cast
int a = 65;
char c = static_cast<char>(a);
cout << c << endl; // 基础数据类型的指针 - 无法转换
// int *p = nullptr;
// char *sp = static_cast<char *>(p); // 对象指针 - 无法转换
// Building *building = nullptr;
// Animal *ani = static_cast<Animal *>(building); // 转换具有基础关系的对象指针
// 父类指针转子类指针
Animal *ani = nullptr;
Cat *cat = static_cast<Cat *>(ani);
// 子类指针转父类指针
Cat *soncat = nullptr;
Animal *anifather = static_cast<Animal *>(soncat);
// 父类引用转子类引用
Animal aniobj;
Animal &aniref = aniobj;
Cat &catref = static_cast<Cat &>(aniref);
// 子类引用转父类引用
Cat catobj;
Cat &catref2 = catobj;
Animal & aniref2 = static_cast<Animal &>(catref2); // 总结:static_cast用于内置数据类型,具有继承关系的指针或者引用的转换
} void Test2()
{
// dynamic_cast只能转换具有继承关系的指针或者引用
// 其在转换之前会进行对象类型的检查 // 内建数据类型的转换 - 无法转换
// dynamic_cast中的类型必须是指向完整类类型或者void *的指针或者引用
// int a = 10;
// char c = dynamic_cast<char>(a); // 非继承关系的指针的转换 - 无法转换,两者不具备继承关系
// Animal *pani = nullptr;
// Building *pbuilding = dynamic_cast<Building *>(pani); // 具有继承关系的指针 - 无法转换,父类指针转子类指针是类型不安全的
// Animal *pani = nullptr;
// Cat *pcat = dynamic_cast<Cat *>(pani); // 具有继承关系的指针 - 可以转换,子类指针转换为父类指针是类型安全的
Cat *pcat = nullptr;
Animal *pani = dynamic_cast<Animal *>(pcat); // 具有基础关系的引用 - 无法转换,原因同样是父类引用转换成子类引用是类型不安全的
// Animal aniobj;
// Animal &aniref = aniobj;
// Cat &catref = dynamic_cast<Cat &>(aniref); // 具有继承关系的引用 - 可以转换,子类引用转父类引用是类型安全的
Cat catobj;
Cat &catref = catobj;
Animal &aniref = dynamic_cast<Animal &>(catref); // 总结:dynamic_cast只能转换具有继承关系的指针或者引用
// 并且只能由子类型转成父类型(基类型)
// 在具有基础关系的指针或者引用的转换上,相较于static_cast,dynamic_cast
// 添加了额外的安全检查,拒绝了类型不安全的转换,更加地安全
} void Test3()
{
// 基础数据类型
int a = 10;
const int &b = a;
// b = 20; b为const引用,无法通过b来修改a的值
// 通过const_cast去除const
int &c = const_cast<int &>(b);
// 通过引用c来修改a的值
c = 20;
// a值为20现在
cout << "a = " << a << endl; // 指针
// 去除const
const int *p1 = nullptr;
int *p2 = const_cast<int *>(p1); // 加上const
int *p3 = nullptr;
const int *p4 = const_cast<const int *>(p3); // 引用 - 去除const
int k = 20;
const int &r1 = k;
int &r2 = const_cast<int &>(r1); // 引用 - 加上const
int j = 30;
int &r3 = j;
const int &r4 = const_cast<const int &>(r3); // 总结:const_cast用来给基础数据类型,指针或者引用“加上”或者“去除”const
} typedef void(*func1)(int, int);
typedef int(*func2)(int, char*); void Test4()
{
// 基础数据类型 - 无法转换
// int a = 10;
// char c = reinterpret_cast<char>(a); // 指针
Building *pbuilding = nullptr;
Animal *ani = reinterpret_cast<Animal *>(pbuilding); // 引用
Building building;
Building &bref = building;
Animal &aniref = reinterpret_cast<Animal &>(bref); // 函数指针
func1 f1;
func2 f2 = reinterpret_cast<func2>(f1); // 总结:reinterpret_cast用于任意两个无关类型的指针或者引用的转换!
// 应该尽量避免在代码中使用类型转换!!!
}

C++ STL——类型转换的更多相关文章

  1. c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

  2. STL的string和wstring

    STL有字符串处理类——stirng和wstring,但是用的时候会觉得不是很方便,因为它不能像TCHAR一样根据定义的宏在char类型字符串和wchar_t进行转换,总不能因为程序要Unicode就 ...

  3. STL学习小结

    STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...

  4. HDU 4287 Intelligent IME(string,map,stl,make_pair)

    题目 转载来的,有些stl和string的函数蛮好的: //numx[i]=string(sx); //把char[]类型转换成string类型 // mat.insert(make_pair(num ...

  5. make_pair() (STL)

    转载来的 Pairs C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象 class pair可以将两个值视为一个单元.容器类别map和multimap就是使用pairs来管理其 ...

  6. STL笔记(6)标准库:标准库中的排序算法

    STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...

  7. STL map 用法

    首先make_pair Pairs C++标准程序库中凡是"必须返回两个值"的函数, 也都会利用pair对象  class pair可以将两个值视为一个单元.容器类别map和mul ...

  8. STL map详细用法和make_pair函数

    今天练习华为上机测试题,遇到了map的用法,看来博客http://blog.csdn.net/sprintfwater/article/details/8765034:感觉很详细,博主的其他内容也值得 ...

  9. 关于Windows API、CRT和STL二三事

    1.本文编写目的    本文是为了帮助一些人弄清一些关于Windows API, C运行时程序库(CRT), 和标准C++库(STL)的基本概念.有很多人甚至是有经验的程序员在这些概念上是含糊不清的甚 ...

随机推荐

  1. 2.XML语言

    XML语言 常见应用: XML技术除用于 /*保存有关系的数据*/之外,它还经常作软件配置文件,以描述程序模块之间的关系. 在一个系统软件中,为提高系统的灵活性,它所启动的模块通常由其配置文件决定 例 ...

  2. 网页接入dingding扫码登录

    前言 有时候我们做了一些网页,希望只有某些人才能看的话,可以搞一个钉钉扫码登录,接入也比较简单,下面记录下接入的过程. 流程 我们先看看官方的文档:钉钉接入文档梳理一下官方的流程:1.先跳去一个扫码网 ...

  3. Collection 和 Collections的区别

    1.java.util.Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体的实现.Coll ...

  4. RobHess的SIFT环境配置

    平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 参考博客:https://www.cnblogs.com/cql ...

  5. 【Day2】4.第三方模块的安装与使用

    课程目标 1. 使用模块 2. 安装第三方模块 使用模块 • 一个.Py文件称之为一个模块(Module) • 好处: 1. 便于代码维护,把很多函数放到不同文件,一个.py文件 的 代码数量少 2. ...

  6. winform 导入 导出 excel

    https://blog.csdn.net/pp_fzp/article/details/51502233

  7. 利用 sendBeacon 发送统计信息

    我们经常会在网站追踪用户的信息,比如记录用户的停留时间. window.addEventListener("unload", () => { // sendHTTP }); ...

  8. 牛客练习赛42 C 出题的诀窍 (贡献,卡常)

    牛客练习赛42 C 出题的诀窍 链接:https://ac.nowcoder.com/acm/contest/393/C来源:牛客网 题目描述 给定m个长为n的序列a1,a2,-,ama_1 , a_ ...

  9. Python&Selenium 关键字驱动测试框架之数据文件解析

    摘要:在关键字驱动测试框架中,除了PO模式以及一些常规Action的封装外,一个很重要的内容就是读写EXCEL,在团队中如何让不会写代码的人也可以进行自动化测试? 我们可以将自动化测试用例按一定的规格 ...

  10. c#使用 NServiceKit.Redis 封装 RedisHelper

    在说StackExchange.Redis 的时候说了,因为我们的项目一直.net4.0不升级,没有办法,我说的不算,哈哈,又查了StackExchange.Redis在.net4.0使用麻烦,所以选 ...