写点什么

为什么不推荐 C++?

发布于: 2021 年 05 月 28 日

C++是一门强大的语言,已经得到了广泛的应用。C++开创了面向对象编程(Object Oriented Programming, 简称 OOP)的时代。


想当初,抱着一本厚厚的 C++书,啃了好几个月,总算把 C++的各种概念都看了一遍。时至今日,C++版本号已经从 11,14,17 升级到 20,后面 C++ 23 预计很快推出。每个版本,都带来众多的强大特性。


因此,强大、复杂,是 C++最鲜明的特点。


但是,国外很多大牛,都对 C++持否定态度,最著名的就是 Linus Torvalds 了,他说:

C++ is a horrible language… C++ leads to really really bad design choices…

翻译成中文:C++是一门可怕的语言… C++的设计哲学是非常差的。


面向对象的思想和工程实践已经持续了 30 多年,从最初对 C++的狂热追捧到日趋理性,人们开始反思:C++带来的好处多,还是副作用更多?


我本人,深入学习过 C++,并且领导和参与过多个大型的 C++项目。从自己的体会出发,我是强烈不推荐大家学习 C++的!


最初,C、C++、Java 三足鼎立的时候,绝大多数从事后端系统开发的人员,基本都会首选 C++,原因在于:

1)Java 性能差,不能手动管理内存,因此首先就被排除了;

2)C++是开箱即用的,C++ 语言本身就自带了各种数据结构和算法,如 Vector、List、Map 等;

3)C++的第三方 Library 众多,如大名鼎鼎的 Boost,ACE 等。


而 C 语言不是开箱即用的,就连个基本的链表都得自己写。因此,对于新手来讲,肯定一下子就投入到 C++的阵营中了。


但是,由于 C++过于复杂,真正能深入掌握 C++,在产品研发中能正确发挥 C++的优势,并规避 C++的弊端,这样的 C++高手寥寥无几。

最终,大量 C++项目都充斥着低质量的代码,代码体量巨大,复杂度极高,阅读极烧脑,维护极困难。


从 C++语言的设计哲学来看,其核心思想要素有三个:继承、多态、封装。

大量程序员对 C++的继承和多态非常重视,对封装的重视程度就差远了。实际上 C++的创始人,他的本意是要强调封装!


从大量的工程实践来看,继承是万恶之源!尤其 C++还支持多重继承!

只所以这么说,是因为当你看到 int i = objA.f1(k); 时,你根本不知道 f1() 是哪个类提供的。可能是父类,也可能是祖父类,还可能是祖祖父类。大型项目中类继承的层次很深,并且还有大量的多重继承。因此,你很难搞清楚,这个语句到底调用的是哪个类的哪个方法。

就连最基本的 ClassK *pk = new ClassK(); 这个语句,如果 ClassK 上面有 5 层父类,并且每个父类的成员变量还是类,搞清楚 new ClassK() 究竟做了哪些动作,就足够让你烧脑了!


继承已经够复杂了。再用重载虚函数方式来实现多态,就使得问题更加复杂化。pk->f2(), 你很难知道到底调用的是谁?就算最基本的 new,可能也是被重载过的操作符!


因此,同样的语句写法,对于不同的类,就是完全不同的代码逻辑。这在一个大型的项目中,多人协作,项目中间人员还可能不断变更,这种代码怎么能维护下去?

大型软件工程,需要的是一致性和确定性。同一种写法的语句,只能有一种确定的含义,这样团队成员才能无障碍地交流和协作,开发速度和软件质量才能得到保障。


另外,C++为了解决内存释放的问题,引入了智能指针,这使得代码的复杂度急剧上升。内存反复传递和 move,你很难搞明白内存最终在哪里被释放的。


为了解决业务问题,真的需要写这么复杂的代码吗?

如果不用继承、多态,就不能实现这个业务需求吗?


其实,不用继承和多态,也是能实现同样的业务需求的。Go 语言本身就不支持继承和多态,同样实现了系统级编程,催生了大量的优秀产品。


大量使用 C++的程序员,由于不能正确发挥 C++的优势,不能规避 C++的劣势,结果写出了数量巨大、臃肿、复杂的代码,难于理解,难以维护。


珍爱生命,请远离 C++!

发布于: 2021 年 05 月 28 日阅读数: 36
用户头像

实力程序员,用实力说话! 2021.05.24 加入

超过20年一线产品研发和技术管理的实力程序员

评论

发布
暂无评论
为什么不推荐C++?