C++类型转换运算符存在的问题

C++类型转换运算符存在的问题

并非所有人都喜欢使用 C++类型转换,即使那些 C++拥趸也如此。其理由很多,从语法繁琐而不够直观到显得多余。

来比较一下下面的代码:

cpp 复制代码
double Pi = 3.14159265;

// C++ style cast: static_cast
int num = static_cast <int>(Pi); // result: Num is 3

// C-style cast 
int num2 = (int)Pi; // result: num2 is 3

// leave casting to the compiler
int num3 = Pi; // result: num3 is 3. No errors!  

在这 3 种方法中,程序员得到的结果都相同。在实际情况下,第 2 种方法可能最常见,其次是第 3 种,但几乎没有人使用第 1 种方法。无论采用哪种方法,编译器都足够聪明,能够正确地进行类型转换。这让人觉得类型转换运算符将降低代码的可读性。

同样, static_cast 的其他用途也可使用 C 风格类型转换进行处理,且更简单:

cpp 复制代码
// using static_cast
Derived* objDer = static_cast <Derived*>(objBase);

// But, this works just as well...
Derived* objDerSimple = (Derived*)objBase;

因此,使用 static_cast 的优点常常被其拙劣的语法所掩盖。 Bjarne Stroustrup 准确地描述了这种境况: "由于 static_cast 如此拙劣且难以输入,因此您在使用它之前很可能会三思。这很不错,因为类型转换在现代 C++ 中是最容易避免的。"

再来看其他运算符。在不能使用 static_cast 时,可使用 reinterpret_cast 强制进行转换;同样,可以

使用 const_cast 修改访问修饰符 const。因此,在现代 C++ 中,除 dynamic_cast 外的类型转换都是可以避免的。仅当需要满足遗留应用程序的需求时,才需要使用其他类型转换运算符。在这种情况下,程序员通常倾向于使用 C 风格类型转换而不是 C++类型转换运算符。重要的是,应尽量避免使用类型转换;而一旦使用类型转换,务必要知道幕后发生的情况。

应该:

复制代码
请牢记,将 Derived*转换为 Base* 被称为向上转换;这种转换是安全的。
请牢记,将 Base*转换为 Derived* 被称为向下转换;除非使用 dynamic_cast 并核实转换成功,否则这种转换不安全。
请牢记,创建继承层次结构时,应尽量将函数声明为虚函数。 这样通过基类指针调用这些函数时,如果该指针指向的是派生类对象,将调用相应类的函数版本。

不应该:

复制代码
使用 dynamic_cast 时,别忘了对转换得到的指针进行检查,看其是否有效。
设计应用程序时,不要使用 dynamic_cast 来依赖于 RTTI。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,

分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,

fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,

TCP/IP,协程,DPDK等技术内容,点击立即学习:

服务器课程:C++服务器

相关推荐
王老师青少年编程3 小时前
2025年12月GESP真题及题解(C++七级): 城市规划
c++·gesp·csp·信奥赛·七级·csp-s·提高组
寻星探路4 小时前
【算法专题】滑动窗口:从“无重复字符”到“字母异位词”的深度剖析
java·开发语言·c++·人工智能·python·算法·ai
我叫袁小陌5 小时前
C++多线程全面详解
开发语言·c++
m0_748250035 小时前
C++ 官方文档与标准
开发语言·c++
matlabgoodboy6 小时前
程序代做python代编程matlab定制代码编写C++代写plc设计java帮做
c++·python·matlab
DYS_房东的猫6 小时前
《 C++ 零基础入门教程》第6章:模板与 STL 算法 —— 写一次,用万次
开发语言·c++·算法
点云SLAM6 小时前
C++ 静态初始化顺序问题(SIOF)和SLAM / ROS 工程实战问题
开发语言·c++·slam·静态初始化顺序问题·工程实战技术·c++static 关键字
pen-ai7 小时前
打通 Python 与 C++ 的参数传递机制
开发语言·c++·python
王老师青少年编程7 小时前
信奥赛C++提高组csp-s之KMP算法详解
c++·kmp·字符串匹配·csp·信奥赛·csp-s·提高组
喵星人工作室7 小时前
C++传说:神明之剑0.4.5装备机制彻底完成
开发语言·c++·游戏