博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么不推荐C++?
阅读量:4110 次
发布时间:2019-05-25

本文共 1675 字,大约阅读时间需要 5 分钟。

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++!

 

转载地址:http://qvlsi.baihongyu.com/

你可能感兴趣的文章
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>
day_21_0817_Mysql
查看>>
day-22 mysql_SQL 结构化查询语言
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
HTML&CSS进阶
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>