分享
 
 
 

C++ In Action

王朝c/c++·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

以前看到过一本书,名字叫《C++ In Action》,在书店中翻阅了几篇,最后并没有决定买它,因为家里的书还没有看完。现在不记得这本书里到底讲了写些什么东西了,不过这个名字很好,一看到名字就有想读的冲动。回想一下自己在学C++的过程中,有时有点幼稚,但有些东西也是值得回味的。

学C++不算久,在此之前接触过VB,而那时对C++的唯一感觉就是别人说的复杂。在转向学习C++时用的工具是Visual C++5.0,知道其中有个东西叫MFC,但不知它到底为何物。在学习过程中(准确地说,这应该叫作学VC/MFC的过程中,而C++的学习只是伴随其中),我将VB上写程序的习惯套用到了VC/MFC的学习中,从表面上认识了C++,认识到C++写程序的风格(准确地说是VC/MFC的风格),但对于我这个连VB都用不好的人来说,这始终太有难度了,没隔多久就停止对VC的学习了。

后来,网上开始广泛流传一本叫《C++ Primer》的读物,这让我重新有了学习C++的冲动。得到这本书之后,迅速浏览了一遍前两章,感觉还是很容易接受,就这样开始踏上C++学习之路。接下来就是看了更多关于C++的书, 这样才逐渐认识到什么是C++。之后,回想起第一次C++的学习过程,庆幸自己中断了学习,试想一下,一个自己认为懂了的东西,还会花时间去在看那些重复的东西吗?所以我庆幸自己中断了学习,不然MFC会成为我对C++的认识,而之后可能不会花时间去认识真正的C++。C++只是一门语言,要想尽可能地掌握它,先必须单独地学习语言基础部分,而不是让自己一开始就通过某个对窗口操作之类例子来认识C++,即使是学习BASIC,在VB中也不应该这样做,就算你这样做成功了,也只是因为BASIC语言本身简单,对客观事物的表现力极强。而C++不是,即使C++中同样可以用两三行代码来为初学者展示,但我们都知道,这样的代码并不是真正意义上的C++,只是套用一些IOStream Library的C代码。而真正意义上的C++例子是怎么样的呢?

BASIC例子:

PRINT “Hello World”

PRINT “Exit”

C++例子:

#include<iostream>

class doer

{

public:

doer(){ std::cout<<”Hello World”<<std::endl; }

~doer(){ std::cout<<”Exit”<<std::end; }

};

int main()

{

doer x;

}

也许有人会说这个例子太极端了,不适合初学者。其实我也是这么想的,一开始就是class,public,构造函数,析构函数,谁也不会接受,但这其中才体现了C++中最基本的概念。我想这正是C++难学,难教的原因之一。如果真有教材这么做了,那么这本教材一定不是给程序初学者(完全没有编程经验的人)看的。每个人都很容易保留“第一次”的记忆,如果一本书一开始就说这是什么什么的,那么他们就对这个的印象根深蒂固了。

接下来的语法学习是一个随时让人心惊肉跳的过程。为什么这里要用这个关键字,为什么那里不用这个关键字,总之新鲜的东西都是突然发生的。指针这东西还好理解,就是一个用来装地址的box,多维指针也好理解,就是一个box里面的地址代表的一个box里面还是一装的地址,但是理解归理解,看到这样代码的还是会令我惧怕。在逐渐认识了指针之后仍然对指针的一个用法感到疑惑。比如下面这个函数

void fun(const char* str){}

int main()

{

fun(“string”);

}

为什么”string”这个字符串可以递给str这个指针,按理说应该是传递给char,而函数fun()应该是void fun(const char)才对。后来,慢慢才知道”string”这个文字常量的本质。现在想来,如果fun()改成void fun(const std::string)也比那个void fun(const char*)好理解一万倍,在教授了引用之后再把void fun(const std::string) 的参数改成const std::string&,就得到一个解释引用优点的极好例子。

异常,当我第一次看到这个东西的时候就知道这是个处理错误的东西。try…cacth()…很容易理解,看了一遍之后就尝试写了段代码来感受一下这东西,几乎没有更多需要注意的了。随着认识的深入,才逐渐认识到异常其实是被设计用来传递控制和信息的工具,它在执行点被抛出,传递给第一个被匹配的捕捉点,它可以从程序内部将控制权和信息传递到外部,这样就提供了一个错误处理手段,而由异常提供的错误处理,只是针对在程序编写中预期定义的逻辑错误,而不是由程序产生的错误。比如一个数被0除,如果没有预先判断这个除数,那么这个错误将由处理器产生,C++异常在此根本察觉不到。这种情况欲使用异常,只有提前进行逻辑判断。

其实在学习类之前的整个过程中,其中的要点,概念都是好理解的。而到了类之后,就有个转折点,至少对我这个从VB上来的菜鸟来说,的确有个思维的转变。还好我自己的悟性不高不低,刚好能理解这个,嘿嘿。

在学习继承的时候,觉得虚函数是最难理解的部分。不知道它有什么用,然后依旧把VB的习惯拿到这里联系了一番,心想在VB中从来都没这么用过(不过我到现在才认识到VB中的确可以实现多态),搞不懂为什么要说它是C++精髓之一。现在看来,当初拿VB来做联系的确有点愚昧,但在当时,几乎不可避免。通过虚函数,可以实现一些通用的算法,或者说,可以获得一定的泛型的能力,可以完全这么说,但有个前提是,必须满足从指定的基类派生的条件。

接下来,学习到C++另一个重镑炸弹,这玩意叫模板。看书的时候,这东西给了我很多的震撼,因为感觉它很先进(看看《C++ Primer》16章开头那一段就能感觉到它的先进),网上众多高手也说这玩意很复杂。在每次亲自感受模板的时候,每次出现编译错误的时候,都是头眼昏花,第一个问题就是why?而当每次成功运行之后,就有种如获至宝的感觉。咬紧牙关,一个字,“冲”。模板学习的难度完全在与语法的难度,概念上它并没class那么高深。能不能发挥模板的威力就要看自己的资历了。

C++的语法之旅就这样完成了。自我感觉良好,也不像那些高手说的复杂。其实现在想来有那样的感觉也没什么不对,对于一个初学者来说,这样的感觉很正常,因为我们初学者至少在这里找到了成就感。而事实这不是语言的全部,正如刚才说的,这只是“语法之旅”。其实我自己根本说不出来什么是语言的全部,但是随着学习的脚步,渐渐知道

1, 指针威胁论,C++不是指针的天下,滥用指针约等于自杀。C++有很好的指针代替方案,例如引用,std::vector等等。

2, 学会一样东西千万不要过分使用,这样只能叫滥用。考虑即将要用到的东西原本是用于什么情况的,做点创新是必要的,但毫无创意的“创新”就是过度使用了,就是滥用了。异常和RTTI就算其中最值得留意的两个。还有尽量避免语言偏门的东西,正是因为大家都认为它有问题,不利于开发,所以才偏门。

3, 异常的语法并不难,而且也可以快速地应用它,但是要用好它就不是那么简单,成败的关键就是能否掌握带异常的程序的执行路径。这不是靠死背,也别指望不是一两天就摸清楚,暗藏的杀机也许在未来的很长一段时间中都不能找到。

4, 类,会了语法就可以写出来,可以通过编译但不一定正确。做到“不变式”是第一要素。另一个难度就是该如何用类来抽象概念,抽象的好坏直接影响到类层次。

5, 模板,它可以让一切事物变得简单透明,也可以让一切事物变成脑细胞杀手,不信就看看boost.lambda或者boost.mpl等等。

6, 《Inside The C++ Object Model》,《D&E》,《Ruminations on C++》可以帮助我们认识C++。当然还有更多的书可以帮助我们学习到如何编写C++程序。

7, C++标准程序库是个好东西,学C++一定要学它,就算对自己的开发没有作用,但是通过它可以了解到C++这门语言的威力,提供自己的编程水平。

8, ……

更多的感悟是随时间增长的,现在才明白没个两三年的功夫是不会入门C++的真谛。现在那本《TC++PL》立在我的书柜里,从买它开始到现在,我还没彻底地从头到尾看完过,有时遇到问题时,把它翻出来看看,总会找到一些新鲜的东西,后来自己一给自己下过把它看完的死命令,但是还是没坚持下来。

什么样的C++程序才是好的程序呢?具体说不上,感觉要把程序写好,肯定有两个大的因素,一个是对语言的认识,这是避免错误的先决条件,不要忘记Murphy’s Law。第二个就是设计问题,好的设计是一个程序生命力的保障。记得以前用VB写了个FTP客户端,仿CuteFTP的,到最后一大堆代码不听使唤,难以修改,最后只有放弃了,其实就差那么点就完成了,现在想来真是可惜。《设计模式》这本书被认为是圣经,合情合理,它指引了一些方法,不过我觉得更有用的是那本《敏捷软件开发》,其中解释了面向对象编程的几个原则问题,这才是指导方针,而设计模式是一种实施手段。当然还有更多更多的书和书中的概念。

感受完毕!今天贴于BLOG,希望得到高手的纠正及指引。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有