框架网站建设,网站建设深圳哪家公司好,婚纱制作网站,重庆网站设计制作价格笔者最近在找工作时#xff0c;无意间读到了一本名为《剑指offer》的书#xff0c;粗略翻阅了一下#xff0c;感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程#xff0c;希望能和这本书的读者朋友们一起交流学习心得… 笔者最近在找工作时无意间读到了一本名为《剑指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_castSon*(new Dad(33, 174));这样就能成功实现类型转换但依然是不安全的。此时调用sonPrt-speak();输出的是父类的speak()的内容。static_cast也常用于基本数据类型之间的转换如double a static_castdouble(1) / 3;输出为对应的浮点数0.333333如果不加类型转换输出为0。也可以实现把void指针转换成目标类型的指针这是极不安全的
dynamic_cast
dynamic_cast会在运行时检查类型转换是否合法具有较高的安全性对于上行转换dynamic_cast的效果和static_cast的效果基本一致但是对于下行转换dynamic_cast会检查转换类型相比static_cast更安全。代码Son *sonPrt dynamic_castSon *(new Dad(33, 174));编译时不会报错但是运行时会产生段错误。dynamic_cast转换仅适用于指针或引用。void *类型转换使用dynamic_cast时必须确保指针指向一个完整类类型然后才能进行void *的转换
class A{virtual void f(){}};
int main()
{A *pA new A;void *pV dynamic_castvoid*(pA);
}const_cast
const_cast的作用是移除或添加const或volatile属性。它是唯一可以用于修改const或volatile修饰符的类型转换运算符。移除const属性举例 const int a 10;
int *pc const_castint *(a);
// int *pc a // 报错
*pc 12;
cout *pc endl; // 输出为12a地址对应的值被修改添加const属性举例
int a 10;
const int *pc const_castconst int *(a);
// *pc 12; // 报错因为pc对应的值是const类型只读
cout *pc endl; // 输出为10reinterpret_cast
非常激进的指针类型转换在编译期完成可以转换任何类型的指针安全性非常低一般不建议使用。