C++之《剑指offer》学习记录(1):类型转换关键字
笔者最近在找工作时,无意间读到了一本名为《剑指offer》的书,粗略翻阅了一下,感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程,希望能和这本书的读者朋友们一起交流学习心得。
介绍:==《剑指Offer:名企面试官精讲典型编程题(第2版)》==剖析了80个典型的编程面试题,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。
编程题链接:牛客网在线编程_算法面试_面试必刷TOP101 (nowcoder.com)
本博客关键词:类型转换关键字
类型转换关键字
先理解两个概念:
- 上行转换:将派生类的指针或引用转换为其基类的指针或引用。这种转换是安全的。
- 下行转换:将基类的指针或引用转换为派生类的指针或引用。这种转换可能不安全。
C++中的类型转换关键字有4种:static_cast
dynamic_cast
const_cast
reinterpret_cast
,调用的统一格式为:cast-name < type > (expression);
,其中cast-name
是转换方式关键字,type
是转换的目标类型,expression
是被转换的值。
static_cast
static_cast
关键字是在编译阶段运行的,不提供动态的检查,所以在编程时就需要确保转换的安全性。- 在类层次结构中转换,假如有父类
Dad
和子类Son
,父类有一个virtual void speak()
方法,子类有一个void speak()
方法。Dad *dadPtr = new Son()
就属于上行转换,这种转换是安全的,如果此时dadPtr->speak();
输出仍为子类对应的speak()
方法的内容。 Son *sonPrt = new Dad(33, 174);
这种属于下行转换,是不安全的,而且在GCC中,这个语句编译器是会报错的,会显示"Dad *" 类型的值不能用于初始化 "Son *" 类型的实体
。这是就需要通过static_cast
来进行下行转换:Son *sonPrt = static_cast<Son*>(new Dad(33, 174));
,这样就能成功实现类型转换,但依然是不安全的。此时调用sonPrt->speak();
输出的是父类的speak()
的内容。static_cast
也常用于基本数据类型之间的转换,如double a = static_cast<double>(1) / 3;
输出为对应的浮点数0.333333
,如果不加类型转换,输出为0。- 也可以实现把void指针转换成目标类型的指针(这是极不安全的);
dynamic_cast
dynamic_cast
会在运行时检查类型转换是否合法,具有较高的安全性,对于上行转换,dynamic_cast
的效果和static_cast
的效果基本一致,但是对于下行转换,dynamic_cast会检查转换类型,相比static_cast
更安全。- 代码
Son *sonPrt = dynamic_cast<Son *>(new Dad(33, 174));
编译时不会报错,但是运行时会产生段错误。 dynamic_cast
转换仅适用于指针或引用。void *
类型转换:使用dynamic_cast
时,必须确保指针指向一个完整类类型,然后才能进行void *
的转换
class A{virtual void f(){}};
int main()
{
A *pA = new A;
void *pV = dynamic_cast<void*>(pA);
}
const_cast
const_cast
的作用是移除或添加const
或volatile
属性。它是唯一可以用于修改const
或volatile
修饰符的类型转换运算符。- 移除
const
属性举例:
const int a = 10;
int *pc = const_cast<int *>(&a);
// int *pc = &a // 报错
*pc = 12;
cout << *pc << endl; // 输出为12,a地址对应的值被修改
- 添加
const
属性举例:
int a = 10;
const int *pc = const_cast<const int *>(&a);
// *pc = 12; // 报错,因为pc对应的值是const类型,只读
cout << *pc << endl; // 输出为10
reinterpret_cast
非常激进的指针类型转换,在编译期完成,可以转换任何类型的指针,安全性非常低,一般不建议使用。
原文地址:https://blog.csdn.net/S13352784013/article/details/142927848
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!