- 浏览: 235767 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
qq594848450:
log4j1.2.17版是这样配置的log4j.additiv ...
Log4J 如何分开Logger输出 -
qq594848450:
非常有用,茅塞顿开。
Log4J 如何分开Logger输出 -
avi9111:
博主知道修改properties 后,如何可以不重新编译,修改 ...
Log4J 如何分开Logger输出 -
ancienthu:
能给我发一个吗?谢谢 406456883@qq.com
Object-C入门好教材《Learn Objective–C on the Mac》 -
lovedame:
// Singleton.h 错误的实例
class S ...
C++多线程的Singleton(1)
我学习使用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这种嵌入式语言。不使用模板,或者非常小范围的使用。不为别的,就好比设计模式没普及之前,面向对象经常被误用;模板设计模式没有普及或者总结之前,在大项目中少用模板,绝对有益处。
评论
呵呵,那只是因为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就是它的后继之人
对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++已经这么多年了
保守阻碍进步,看看W3C对AJAX的阻碍程度(Xmlhttprequest还在扯皮)...OpenGL在ARB这个官僚机构的领导下OpenGL 1.0推出后的相当长一段时间毫无建树,最后被MS牵着鼻子走(见Vertex诉讼);
呵呵,那只是因为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
标准是比较保守的才对。
呵呵,那只是因为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
呵呵,那只是因为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++还真是个垃圾。可惜很多时候,只有靠这个垃圾才能骗更多的工资。
明显是因为各厂商垃圾么。
呵呵,那只是因为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++ object model是很基本的东西,如果真需要排列,放在 simple oo后比较合适。如果需要考虑效率以及资源,内存模型都应该一开始就了解的;即使不需要了解,这个东西也是很简单的。
还是挺喜欢Java语言,C++虽然功能强,但有些复杂了,而且没有Java那么丰富的API和开源项目支持。
对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)新标准早日出现!
程序员的主要精力还是要放在和需求作斗争上, 而不是去解开复杂的一团乱麻.
也正是这样,程序员民工化了。
我更愿意成为一个偏重于内核分析,底层探索的人,这才是程序员,这也是我逐渐远离java的原因。
当前,前提是你决定长期走技术路线。
java底层很可怕的。。。
程序员的主要精力还是要放在和需求作斗争上, 而不是去解开复杂的一团乱麻.
也正是这样,程序员民工化了。
我更愿意成为一个偏重于内核分析,底层探索的人,这才是程序员,这也是我逐渐远离java的原因。
当前,前提是你决定长期走技术路线。
支持这位兄弟,我也早就开始远离java了。
发表评论
-
一些有意思的问题和解答(未完待续)
2012-02-21 10:16 1597最近一直在面试,一直觉得面试就是一个交互的过程,在面试中也经常 ... -
程序员不要教条主义
2011-11-02 06:59 1512记得刚参加工作不久,我写了一个工具,是从文档自动生成代码的工具 ... -
C++多线程的Singleton(2)
2011-03-15 23:13 2321C++多线程的Singleton(1) 如果你的系统有 ... -
不要在C++的复杂细节上浪费太多生命,请
2011-02-01 01:25 2704今晚在水木上看到一个帖子,我转载一下楼主的问题: cla ... -
C++多线程的Singleton(1)
2011-01-15 00:06 4666C++多线程的Singleton(2) Singlet ... -
保持简单的设计
2011-01-14 23:20 0我有的时候觉得自己很好玩,晚上还在iPhone上写软件,学习写 ... -
好的面试题和不好的面试题
2010-05-26 22:38 3365C++在中国有很大的市场需求,几乎现在找工作,C++和Java ... -
我们到底需要怎样的C++
2010-05-26 22:18 0我自己学习使用C++有八年了,看过的书有以下几本: 《C++ ... -
<C++ 0x Prestudy> -- 安装GCC4.5
2010-05-11 22:59 0最近,C++ 0x标准出炉了, 听说Bjarne先生正在写&l ... -
C++ Plug-in 技术的一些深度思考(2)
2009-12-02 14:40 2148C++ Plug-in 技术的一些深度思考(1) 我们 ... -
C++ Plug-in 技术的一些深度思考(1)
2009-12-02 14:14 2494C++ Plug-in 技术的一些深度思考(2) ...
相关推荐
但同时也增加了程序的复杂性和潜在的错误。 7. **函数重载和运算符重载**:C++允许函数和运算符有多个不同的实现,根据传入参数的类型和数量来选择合适的版本。这提供了更自然的语法和更灵活的设计。 8. **预...
《Thinking in C++》是一本深受程序员喜爱的C++学习书籍,由Bruce Eckel撰写,旨在帮助读者深入了解C++这门编程语言,并纠正普遍...对于那些希望通过深入学习来挑战C++复杂性的程序员来说,这本书是不可多得的资源。
文档讨论了C++的一些核心抱怨点,包括产生新的bug类别,代码编写困难,以及代码的难以阅读性。 具体到代码实现中,我们可以看到作者展示了由于类型转换问题导致的一个错误案例。在代码示例中,作者试图对一个list中...
然而,由于C++本身的复杂性和难度,高质量的学习资源相对较少。 #### 知识点解读: - **C++资源的重要性**:C++是一种强大的编程语言,被广泛应用于系统级编程、游戏开发、高性能计算等领域。因此,高质量的学习...
标题中的"C++编程自我认识"指的是作者在学习C++编程过程中的个人见解和经验分享,主要是针对初学者的指导。描述中提到,作者认为学习C++编程需要有正确的路径和扎实的基础,不宜急于求成,尤其是对VC(Visual C++)...
但是,它也存在一些缺点,如难以表达复杂的关系和数据结构。C++语言的面向过程编程特点使得它可以与其他语言集成,并且可以用于开发操作系统、数据库等底层软件。 程序的编辑、编译和运行的基本概念 C++程序的编辑...
它的复杂性不仅仅体现在语法上,更在于其强大的功能和灵活性。学习C++不仅需要时间,还需要正确的方法和态度。以下是关于C++特性的几点重要认识: 1. **难度高**:C++的学习曲线非常陡峭,初学者可能会感到沮丧。这...
《C++之父Bjarne谈C++的未来发展》一文深入探讨了C++语言及其标准库的发展方向,尤其关注于解决现有标准中的一些缺陷,以及如何更好地支持泛型编程和初学者。以下是对该文章核心观点的详细解析: ### 泛型编程的...
内容概要:这篇《C++读书笔记》分享专栏涵盖了多项重要作品的精要总结,包括《Effective C++》,《More ...其他说明:通过对实际示例的理解以及对C++语法特性的详细阐述,本文档有助于加深对C++复杂机制的认识。
在译序中,侯捷也分享了他对教育工作的热忱和对于不同初学者群体的认识。他意识到,尽管初学者的概念似乎比较笼统,但实际上他们涵盖了广泛的背景和经验水平。无论是没有任何编程背景的初学者,还是已经具有其他编程...
Java是一种广泛使用的编程语言,以其...然而,这种强大功能的背后是复杂性的增加,这可能导致开发时间和资源的消耗。面对其他如.NET和Ruby等语言的竞争,Java需要不断优化和完善自身,以保持其在编程领域的领先地位。
通过这些试题的实践,自考生可以巩固对C++语言的理解,提升编程能力,同时对自考中的常见题型有更直观的认识。建议考生在做题过程中,不仅要关注答案,更要理解解题思路,深入探究每个知识点的原理,以达到举一反三...
阅读《Inside The C++ Object Model》后会对自己学到的C++有更深的认识 该书深入剖析了C++对象模型内部的工作原理,通过阅读这本书可以更深刻地理解C++是如何工作的。 ### 30. 学习C++是一个循序渐进的过程 不要...
1. **重新认识C++**:将C++视为一门全新的语言来学习,而非C的简单扩展。这意味着学习C++时应抛开对C语言的先入为主观念,从零开始,以开放的心态去理解和掌握C++的独特特性和设计哲学。 2. **优质学习资源的选择**...
掌握这些概念,不仅能够帮助我们更有效地组织和管理代码或数据,还能够促进模块化、复用性和灵活性,从而提高软件的开发效率和维护性。在实际应用中,理解这些概念之间的联系和区别,能够使我们更加灵活地应对复杂的...
【基于C++的航空管理系统详解】 航空管理系统是一个用于管理和调度航空公司日常运营的软件系统,它涵盖了乘客服务、航班安排、票务...通过实践,开发者不仅可以提升编程技能,也能对航空行业的运营有更直观的认识。