`

我对C++复杂性的一些认识

阅读更多

我学习使用C++,已经有差不多7,8年了。从当年在学校写小程序,到后来在公司写程序做设计。从VC++(虽然它不是标准C++),到后来嵌入式的C++,到现在在项目中,标准的C++。坦白说,C++确实很复杂,和Java, Objective-C,Python,Ruby这些语言比,它确实很复杂。这种复杂来自于几个方面:
[1] 编程的模式太多。面向过程,基于对象,面向对象,泛型。而且在面向对象的时候,它可以多继承(真正的多继承,不是那种多个接口一个父类的),虚继承,私有继承。
[2] 标准库的想法很完美,可是坦白说,库的级别太底层。举个例子std::string,没有提供一个函数可以将所有substr替换成另外一个,你需要自己用find和replace写一个;没有一些标准的库,譬如单元测试,Logger库。我知道有Boost,可是有的平台boost不能编译通过。
[3] 语言细节太诡秘,而且编译器之间有差别(实现)

我觉得[1]不是什么本质的问题,而是我们对待C++的问题。本来支持的东西多是好事,而且C++承诺你不用到一个属性的时候,这个属性存在不会拖你效率的后腿。一开始,我们根本不需要掌握多继承,虚拟继承,私有继承。因为这些在绝大多时候都用不上。只会共有继承,继承的时候用单个基类和多个接口(就是全部是纯虚函数)的那种,然后结合设计模式。基本可以解决设计上90%的问题。然后,你要知道C++有其他继承的这些功能,当你熟练了前面那些东西以后,并且发现在项目中确实上面的东西解决不了设计上的问题的时候,用上新的技术来解决问题。
[2] 这个东西就不好说了。虽然标准库设计的不错,但是对使用人员要求太高。现实中,合格的C++程序员真的不多,或者换个角度说,库做的还不够,有的时候它太灵活。我承认用C++的项目对性能都要求很高,但确实不需要那么高。所以,其实C++的标准库可以提供另一个好用但性能稍微有些缺陷的库,我们是可以接受的。就目前SL里面的string, io,这些库,真的需要改进。还有增加hashtable,增加logger,和UnitTest库。
[3] 这个问题和1一样,用到的时候再去了解,不用了解的太仔细。想当年,我把重载规则烂熟于心,现在还是忘的一干二净。因为太复杂太细节了。

现在我来看,虽然C++很复杂,但我至今认为它的功能是非常强大的。我是指在系统设计上,它支持的范式是如此之多。它的复杂性是因为我们太想掌握它的所有,其实,我们应该掌握那部分我们最应该掌握的:
面向过程,设计对象,面向对象,标准库。然后看看设计模式,多线程,操作系统的接口。然后就是多写程序,多看好的代码(我强烈建议不要看烂代码)。然后,就是开始用C++的思路去设计系统。在设计中去找到C++这些特性的应用场景,再去掌握它。那个时候,你就会自然而然的理解为什么有私有继承,需要多继承,需要虚继承,需要模板。你很多时候就会恍然大悟,哦,原来<The C++ Programming Language》上这段话是这个意思。慢慢的,你就能驾驭这种复杂性。
当然了,C++仍然缺乏一些其他语言的特性,我觉得:垃圾回收和反射。即使在电信金融这种项目中,垃圾回收都是有好处的。至少这个特性应该可选。反射,Java的反射可以为Java带来很多有用的设计方法,C++没有这个(0x也没有)。另外,我觉得C++的头文件机制也有必要修改(如果可以的话)。
当然,如果有个新项目来,我现在会首先考虑Java。因为C++对整个团队要求太高。而且开发效率太低了。在对性能要求很高的地方我用C++,其他不关键的地方我用Java,再变动大的地方我会选择用lua这种嵌入式语言。不使用模板,或者非常小范围的使用。不为别的,就好比设计模式没普及之前,面向对象经常被误用;模板设计模式没有普及或者总结之前,在大项目中少用模板,绝对有益处。

分享到:
评论
34 楼 lichong_87 2010-04-24  
mark
 
33 楼 thinkry 2010-03-20  
编程语言也是需要运营的,Java .Net有两大厂商的支持,语言更新、工具支持、社区建设都有人在做。C/C++,大家都是毁誉参半,又恨又爱,主要原因是委员会没什么做为,也可能跟大厂商的打压有关。
32 楼 haibo 2010-03-19  
wandou 写道
ray_linn 写道
wandou 写道
C++倒也不难,只是各种string的转换比较让人厌烦。


呵呵,那只是因为char压根没考虑Unicode的缘故,一般应该用TCHAR而不是Char.

CHAR为单字节字符。
WCHAR为Unicode字符,
如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。
在Windows下,应该采用Unicode字符而不是ANSI,因为所有的WindowsAPI都是unicode的(你说那些ANSI API,他们只是Unicode的Wrapper).

LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。

一张对照表:

LPSTR = char *
LPCSTR = const char *
LPWSTR = wchar_t *
LPCWSTR = const wchar_t *
LPOLESTR = OLECHAR * = BSTR = LPWSTR(Win32)
LPCOLESTR = const OLECHAR * = LPCWSTR(Win32)

LPTSTR = _TCHAR *
LPCTSTR = const _TCHAR *

MC++可以用.net标准的String, 其他C++或者用QT的QString.

ole库还定义了一堆string。还有stl的string,bcb的string,产商自己搞的string,百花齐放。要说起来嘛,c++还真是个垃圾。可惜很多时候,只有靠这个垃圾才能骗更多的工资。


正解,c++就像一个年久失修的项目,迎来一批又一批的人,,每来一批人都不想重构上一批人写的垃圾代码,或者说不允许,所以大家都往里加一些特性已修补已有的漏洞或增加新的特性,,大家都很痛苦,,可慢慢地,慢慢地,大家开始适应,直到现在大家认为它真是太高深了,,同时倍加尊重那些前辈。

c++也不用出什么新标准,没必要,,做好自己善于做的领域就行了,,其他的事交给其他人吧,java/php/python就是它的后继之人
31 楼 metaphy 2009-12-31  
slatp 写道
个人认为如果当初不叫c++,而起另外的名字我觉得就不会是这样了~
对c的兼容性成为了c++衍化的束缚,指针永远是咱c++程序员挥之不去的噩梦。
c++是一门极其复杂的语言,对程序员的要求太高:basic c--->simple 00--->stl--->effective c++--->desgin patterns--->templates-meta programming--->boost--->c++ object model,考虑到大部分c++程序员都会学mfc,opengl或d3d之类的库,所花的时间可想而知。我从大二学习c++到现在也差不多4年了,也写了不下数万行的纯c++代码,但是实际开发时仍会碰到不少问题。
不过c++的效率是其他任何高级语言都不能匹敌的,期待c++0x(or c++1x)新标准早日出现!


这个所谓的新标准还是不要期待了,理由如下: 如果它能出现,那它早就应该出现了,毕竟C++已经这么多年了
30 楼 ray_linn 2009-12-29  
mikeandmore 写道
标准是比较保守的才对。



保守阻碍进步,看看W3C对AJAX的阻碍程度(Xmlhttprequest还在扯皮)...OpenGL在ARB这个官僚机构的领导下OpenGL 1.0推出后的相当长一段时间毫无建树,最后被MS牵着鼻子走(见Vertex诉讼);
29 楼 mikeandmore 2009-12-29  
ray_linn 写道
mikeandmore 写道
wandou 写道
ray_linn 写道
wandou 写道
C++倒也不难,只是各种string的转换比较让人厌烦。


呵呵,那只是因为char压根没考虑Unicode的缘故,一般应该用TCHAR而不是Char.

CHAR为单字节字符。
WCHAR为Unicode字符,
如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。
在Windows下,应该采用Unicode字符而不是ANSI,因为所有的WindowsAPI都是unicode的(你说那些ANSI API,他们只是Unicode的Wrapper).

LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。

一张对照表:

LPSTR = char *
LPCSTR = const char *
LPWSTR = wchar_t *
LPCWSTR = const wchar_t *
LPOLESTR = OLECHAR * = BSTR = LPWSTR(Win32)
LPCOLESTR = const OLECHAR * = LPCWSTR(Win32)

LPTSTR = _TCHAR *
LPCTSTR = const _TCHAR *

MC++可以用.net标准的String, 其他C++或者用QT的QString.

ole库还定义了一堆string。还有stl的string,bcb的string,产商自己搞的string,百花齐放。要说起来嘛,c++还真是个垃圾。可惜很多时候,只有靠这个垃圾才能骗更多的工资。

明显是因为各厂商垃圾么。


应该说define太强大...强大到有点像扁它的味道。

#define MY_LPSTR char *
#define MY_LPCSTR const char

一下不就造了2个String? 另外是C++标准走得太慢,比如unicode的支持,迟迟不能决定,也早就了诸多不同的String.

不是厂商垃圾,诸多不符合标准的东西,常常是因为是掌握标准的组织太垃圾,这些名单里有W3C, OpenGL,还是C++ iso

标准是比较保守的才对。
28 楼 mathgl 2009-12-28  
C++作为 ISO来说 不可能会有类似python这种 battery included的lib。毕竟加一个feature是要投票的。boost搞了这么久也就是个准 iso lib。
27 楼 ray_linn 2009-12-28  
mikeandmore 写道
wandou 写道
ray_linn 写道
wandou 写道
C++倒也不难,只是各种string的转换比较让人厌烦。


呵呵,那只是因为char压根没考虑Unicode的缘故,一般应该用TCHAR而不是Char.

CHAR为单字节字符。
WCHAR为Unicode字符,
如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。
在Windows下,应该采用Unicode字符而不是ANSI,因为所有的WindowsAPI都是unicode的(你说那些ANSI API,他们只是Unicode的Wrapper).

LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。

一张对照表:

LPSTR = char *
LPCSTR = const char *
LPWSTR = wchar_t *
LPCWSTR = const wchar_t *
LPOLESTR = OLECHAR * = BSTR = LPWSTR(Win32)
LPCOLESTR = const OLECHAR * = LPCWSTR(Win32)

LPTSTR = _TCHAR *
LPCTSTR = const _TCHAR *

MC++可以用.net标准的String, 其他C++或者用QT的QString.

ole库还定义了一堆string。还有stl的string,bcb的string,产商自己搞的string,百花齐放。要说起来嘛,c++还真是个垃圾。可惜很多时候,只有靠这个垃圾才能骗更多的工资。

明显是因为各厂商垃圾么。


应该说define太强大...强大到有点像扁它的味道。

#define MY_LPSTR char *
#define MY_LPCSTR const char

一下不就造了2个String? 另外是C++标准走得太慢,比如unicode的支持,迟迟不能决定,也早就了诸多不同的String.

不是厂商垃圾,诸多不符合标准的东西,常常是因为是掌握标准的组织太垃圾,这些名单里有W3C, OpenGL,还是C++ iso
26 楼 mikeandmore 2009-12-28  
wandou 写道
ray_linn 写道
wandou 写道
C++倒也不难,只是各种string的转换比较让人厌烦。


呵呵,那只是因为char压根没考虑Unicode的缘故,一般应该用TCHAR而不是Char.

CHAR为单字节字符。
WCHAR为Unicode字符,
如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。
在Windows下,应该采用Unicode字符而不是ANSI,因为所有的WindowsAPI都是unicode的(你说那些ANSI API,他们只是Unicode的Wrapper).

LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。

一张对照表:

LPSTR = char *
LPCSTR = const char *
LPWSTR = wchar_t *
LPCWSTR = const wchar_t *
LPOLESTR = OLECHAR * = BSTR = LPWSTR(Win32)
LPCOLESTR = const OLECHAR * = LPCWSTR(Win32)

LPTSTR = _TCHAR *
LPCTSTR = const _TCHAR *

MC++可以用.net标准的String, 其他C++或者用QT的QString.

ole库还定义了一堆string。还有stl的string,bcb的string,产商自己搞的string,百花齐放。要说起来嘛,c++还真是个垃圾。可惜很多时候,只有靠这个垃圾才能骗更多的工资。

明显是因为各厂商垃圾么。
25 楼 wandou 2009-12-28  
ray_linn 写道
wandou 写道
C++倒也不难,只是各种string的转换比较让人厌烦。


呵呵,那只是因为char压根没考虑Unicode的缘故,一般应该用TCHAR而不是Char.

CHAR为单字节字符。
WCHAR为Unicode字符,
如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。
在Windows下,应该采用Unicode字符而不是ANSI,因为所有的WindowsAPI都是unicode的(你说那些ANSI API,他们只是Unicode的Wrapper).

LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。

一张对照表:

LPSTR = char *
LPCSTR = const char *
LPWSTR = wchar_t *
LPCWSTR = const wchar_t *
LPOLESTR = OLECHAR * = BSTR = LPWSTR(Win32)
LPCOLESTR = const OLECHAR * = LPCWSTR(Win32)

LPTSTR = _TCHAR *
LPCTSTR = const _TCHAR *

MC++可以用.net标准的String, 其他C++或者用QT的QString.

ole库还定义了一堆string。还有stl的string,bcb的string,产商自己搞的string,百花齐放。要说起来嘛,c++还真是个垃圾。可惜很多时候,只有靠这个垃圾才能骗更多的工资。
24 楼 moonlitsky 2009-12-25  
如果觉C++麻烦,你可以使用python啊,然后用c优化,多好啊!
23 楼 NeuronR 2009-12-21  
膜拜(楼上::楼上, 楼上::楼上::楼上);
22 楼 mikeandmore 2009-12-19  
C++的对象模型应该不能算简单吧。。。
虽然算不上复杂。。。-,-但是涉及的东西还是比较多的。。
21 楼 truekbcl 2009-12-19  
basic c--->simple 00--->stl--->effective c++--->desgin patterns--->templates-meta programming--->boost--->c++ object model
-----------------------
c++ object model是很基本的东西,如果真需要排列,放在 simple oo后比较合适。如果需要考虑效率以及资源,内存模型都应该一开始就了解的;即使不需要了解,这个东西也是很简单的。
20 楼 zzy9zzy 2009-12-19  
我开始也用C++,特别喜欢指针,觉得对内存控制力超强。第二喜欢STL模板库,自己写那些基础的东西没什么意思了。C++的书太多了,看了几十本还有几百本等着,实在看不过来。现在做软件,就是用Java,C++一般的开发用不到了。不过以前在C++上下的死功夫没有白费,Java用起来心里有底,内存控制的住。

还是挺喜欢Java语言,C++虽然功能强,但有些复杂了,而且没有Java那么丰富的API和开源项目支持。
19 楼 slatp 2009-12-18  
个人认为如果当初不叫c++,而起另外的名字我觉得就不会是这样了~
对c的兼容性成为了c++衍化的束缚,指针永远是咱c++程序员挥之不去的噩梦。
c++是一门极其复杂的语言,对程序员的要求太高:basic c--->simple 00--->stl--->effective c++--->desgin patterns--->templates-meta programming--->boost--->c++ object model,考虑到大部分c++程序员都会学mfc,opengl或d3d之类的库,所花的时间可想而知。我从大二学习c++到现在也差不多4年了,也写了不下数万行的纯c++代码,但是实际开发时仍会碰到不少问题。
不过c++的效率是其他任何高级语言都不能匹敌的,期待c++0x(or c++1x)新标准早日出现!
18 楼 jjcang 2009-12-18  
或许是我水平太低。多继承,模板和各种泛型库还是少用
17 楼 visualcatsharp 2009-12-16  
又是一群只讨论语法的人。
16 楼 mikeandmore 2009-12-16  
mxswl 写道
Elrond 写道

程序员的主要精力还是要放在和需求作斗争上, 而不是去解开复杂的一团乱麻.


也正是这样,程序员民工化了。
我更愿意成为一个偏重于内核分析,底层探索的人,这才是程序员,这也是我逐渐远离java的原因。
当前,前提是你决定长期走技术路线。

java底层很可怕的。。。
15 楼 hepeng421 2009-12-16  
mxswl 写道
Elrond 写道

程序员的主要精力还是要放在和需求作斗争上, 而不是去解开复杂的一团乱麻.


也正是这样,程序员民工化了。
我更愿意成为一个偏重于内核分析,底层探索的人,这才是程序员,这也是我逐渐远离java的原因。
当前,前提是你决定长期走技术路线。

支持这位兄弟,我也早就开始远离java了。

相关推荐

    简述C++的复杂性

    主要介绍了简述C++的复杂性,帮助大家更好的理解和认识c++编程语言,感兴趣的朋友可以了解下

    C++多范型设计 作者:[美]James O.Coplien

    第7章综合考虑前几章的内容,介绍了结构复杂性不同的设计问题的分类,以及可作为基于领域分析和多范型设计技术基础的高级活动集合。第8章研究结构复杂的设计,并介绍如何组合各种范型。第9章补充说明了流行的设计...

    Visual C++技术内幕(第四版).part6.rar

    我从94年开始就使用Visual C++,而且在开发工作中涉及的技术范围比较广,所以翻译这本书对我来说难度不大,除了书的最后个别地方我不太熟悉,其他所有的章节我都能很轻松地表达出来。整个翻译过程也是我再学习的过程...

    C++在编程语言界的地位如何?学好C++可以做些什么?.docx

    C++在编程语言界的地位如何?学好C++可以做些什么? C++是一种非常重要的编程语言...同时,也可以参加一些线下或线上的课程、培训或研讨会,这些活动不仅可以提升自己的技能水平,还可以认识一些志同道合的朋友,建立自

    Visual C++技术内幕(第四版)配套光盘

    我从94年开始就使用Visual C++,而且在开发工作中涉及的技术范围比较广,所以翻译这本书对我来说难度不大,除了书的最后个别地方我不太熟悉,其他所有的章节我都能很轻松地表达出来。整个翻译过程也是我再学习的过程...

    C++多范型设计

    第7章综合考虑前几章的内容,介绍了结构复杂性不同的设计问题的分类,以及可作为基于领域分析和多范型设计技术基础的高级活动集合。第8章研究结构复杂的设计,并介绍如何组合各种范型。第9章补充说明了流行的设计...

    Visual C++技术内幕(第四版).part4.rar

    我从94年开始就使用Visual C++,而且在开发工作中涉及的技术范围比较广,所以翻译这本书对我来说难度不大,除了书的最后个别地方我不太熟悉,其他所有的章节我都能很轻松地表达出来。整个翻译过程也是我再学习的过程...

    C++MFC教程

    需要选择一些对原理讲解的比较透彻的书籍,这样一来才会对新技术有更多的了解,最好书中对技术的应用有一定的阐述。尽量选择示范代码必较精简的书,可以节约银子。 此外最好涉猎一些辅助性的书籍。 1.2 理解Windows...

    C++入门到精通

    内容之后 你应该对 C++语言有了一些认识 但是还谈不上真正理解C++ 这就够了 那是 本书余下部分的目的 第 1 章向我们介绍了语言的基本元素 内置数据类型 变量 表达式 语句以及函数 它将介绍一个最小的 合法的 C++...

    Visual C++技术内幕(第四版)目录

    我从94年开始就使用Visual C++,而且在开发工作中涉及的技术范围比较广,所以翻译这本书对我来说难度不大,除了书的最后个别地方我不太熟悉,其他所有的章节我都能很轻松地表达出来。整个翻译过程也是我再学习的过程...

    最小二行乘法 C++和Python实现源码带注释+数据分析报告

    通过此次试验,使我对最小二乘法有了更加深刻的认识,对其在生产实践和科学实验中的应用也有了一定的了解。在求解正则方程组时使用了SOR方法,也使得我更加熟练的掌握SOR求解方程组的方法。同时,通过将书中的理论...

    Visual C++技术内幕(第四版).part1.rar

    我从94年开始就使用Visual C++,而且在开发工作中涉及的技术范围比较广,所以翻译这本书对我来说难度不大,除了书的最后个别地方我不太熟悉,其他所有的章节我都能很轻松地表达出来。整个翻译过程也是我再学习的过程...

    Visual C++技术内幕(第四版).part2.rar

    我从94年开始就使用Visual C++,而且在开发工作中涉及的技术范围比较广,所以翻译这本书对我来说难度不大,除了书的最后个别地方我不太熟悉,其他所有的章节我都能很轻松地表达出来。整个翻译过程也是我再学习的过程...

    Visual C++技术内幕(第四版).part3.rar

    我从94年开始就使用Visual C++,而且在开发工作中涉及的技术范围比较广,所以翻译这本书对我来说难度不大,除了书的最后个别地方我不太熟悉,其他所有的章节我都能很轻松地表达出来。整个翻译过程也是我再学习的过程...

    Visual C++技术内幕(第四版).part5.rar

    我从94年开始就使用Visual C++,而且在开发工作中涉及的技术范围比较广,所以翻译这本书对我来说难度不大,除了书的最后个别地方我不太熟悉,其他所有的章节我都能很轻松地表达出来。整个翻译过程也是我再学习的过程...

    对于C++网络编程的一点了解

    以下是《C++网络编程:用ACE和模式消除复杂性》这本书内容的框架:为了降低耦合性,降低复杂度,提高复用性,ACE设计成了层次化体系结构。ACE被设计为两层:ACE OSAdaptation层和C++WrapperFacades。(1).ACEOS

Global site tag (gtag.js) - Google Analytics