我是一匹静静奔跑的骏马\r\n ~~~~~~~~~~~~~~~~~~~\r\n in doing we learn!\r\n ~~~~~~~~~~~~~~~~~~~\r\n

c++学习感想

上一篇 / 下一篇  2007-09-13 22:24:32

LUPA开源社区#S.v(_%f8Z Y1d.\i

C++的学习感想  LUPA开源社区 @d @#S`Je f/K1p
原作者姓名 robindy LUPA开源社区%\0F#y(r\
正文LUPA开源社区cu;fuN3{7V
很多人把学习C++语言当成学习VC了,我曾经就走过这样的弯路。当学了很长时间的VC后LUPA开源社区/A6NrLN%s$U)] EX
还是得回过头来学习C++语言本身。

}GR {$G)Gp0 LUPA开源社区'G3JJ,Y4Ei

那么学习C++从何处入手了?
?$sl/yU.B(H0C++语言相对于C语言来说引入了两个大的新东西,一个就是面向对象(具体来将就是类
6^F9Rx^5`2X0),另外就是模板技术(模板编程或者叫泛型编程是进来非常流行的技术,在C#中虽然还
-uyk|'r_1d0没有对泛型编程的支持,但是相信在将来也一定会加入这一功能),模板是C++中比较复
7l Gk.|p%V0杂的部分,但是作为一个真正的C++程序员,这部分很重要。尤其是对C++标准程序库
#D oZXq0的掌握尤为重要。
+QfKfMc(} c,a;[&j0刚开始的时候千万不要直扑VC中的各种向导和设计器。因为依赖开发环境生成的很多代码
#|Qtr-TL W0会把我们搞糊涂,也不利于我们学习C++语言本身。我的建议就是生成一个空的控制台工
*j;c?E:G0程,然后自己向里面添加文件。
|E1?{ j0如下就是一个简单的控制台程序:
MBt!]O-G[o0//robindy/list.cpp
LUPA开源社区GtI8U%b n\(Z

LUPA开源社区IT4d6lW&v4@n"r2_0h C(r

#include  <iostream>
Y Ri3AS*D0#include  <list>
LUPA开源社区V:m4|6~dUt{

LUPA开源社区zx'w)U1z8r.f

using namespace std;

(] ]!oE1v(e2R }"pp0 LUPA开源社区*xal`-}8M1qI8U'\

int main()
oz I(~;D9zI,T0x0{LUPA开源社区1GX8GND0X:h2c&Xu[
    list<char> coll;
LUPA开源社区 Qp8E&x/I7@

LUPA开源社区!Oi6@O/n*f^

    for(char c = 'a'; c <= 'z'; ++c)LUPA开源社区0r0Md!}m5EE
    {
V)aS6E*u:@pM2M0        coll.push_back(c);
U Rr ~0F(sc$n'\0    }

Dt1c-mY+j K0

U GV)J}0    list::const_iterator pos;
z:r$n"t@V0    for(pos = coll.begin(); pos != coll.end(); ++pos)LUPA开源社区/gh2zM#],WvNP
    {LUPA开源社区l k:EL u,d
        cout << *pos << ' ';LUPA开源社区*^Y7A C4b/fG
    }
K*k#}ET!a5R4m0    cout << endl;
LUPA开源社区&|%OCb7B'Am${

Z I-l$o8I k@0    return 0;LUPA开源社区 { TItC4Qm9QxS!y
}

-\7qlo,u0ji o0

L/t5^O#C:]g1jdd0对using namespace std;的解释:LUPA开源社区7e*@ d\"n4k
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
!peQ$S c l V$d0由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:LUPA开源社区9C6H v~0tc c
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:LUPA开源社区 O7C#J Z'{Q3FK.O4V
std::cout << std::hex << 3.4 << std::endl;LUPA开源社区&hF9`S||"\!h
2、使用using关键字。
JN0ahX0c+E0using std::cout;LUPA开源社区 v$\:dvnc
using std::endl;LUPA开源社区y-_5d\1XP'p
以上程序可以写成
^4GwrG%Y2O0cout << std::hex <<  3.4 << endl;LUPA开源社区W"z|yIJGM{5@
3、最方便的就是使用using namespace
5s$t8^-y/n/B0std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:LUPA开源社区0i ];K a7E2YaR i
cout << hex << 3.4 << endl;

2m~6UQ i;v5MeOY0

9tl'X` G9c0这段程序用到了标准模板库,在屏幕上打印字符a~z,其中main函数的标记式只有两种是被LUPA开源社区(T1`l\E\4gYKJ
C++标准委员会接受的,只有以下两种写法是符合C++标准的,是可移植的。即:LUPA开源社区oS$y hHg.C-?o"S
int main()
4OwPwq@~} r @0{LUPA开源社区hI,nyrY EqCBv
}
*nG v@RMA n0
H&TMn.i J?Y0int main(int argc, char* argv[])
t\y`2nCa_ j0{
ySBpNM4_0}LUPA开源社区$F!nqz#dF
C++在main()的末尾定义了一个隐式的return 0; 但是在VC中必须显式的写出return语句。
0NkfDgA#q8j0在BCB中可以不写return而编译通过。
p(CfT!Q~qf8i0这段程序中用到了STL中的容器:链表。先是向链表中插入26个字母,然后从遍历链表,输LUPA开源社区H!k$C'] Z;ef
出字符。
4d8?Obtc0我不建议初学者一开始就从模板库入手,但是我建议应该逐渐地有意识地学习模板库。如LUPA开源社区9leV Ln z
我们应该熟悉cout和cin的用法(位于iostream),而减少使用老式的C函数库中printf和sc
N-Q c T!@7P$t}7o0anf等。
LUPA开源社区0Ib6W'rQW#G|

LUPA开源社区TT Yg6g

从控制台入手的好处就是避免我们理解VC中向导等工具生成的其他代码,整个程序的流程
0I#P;e4O8h/{H0很清楚。新手学习VC的一大难点就是搞不清楚整个程序的流程(从那条语句开始执行,然后LUPA开源社区1ML1Te&SJ5GR4h@
从那条语句退出。MFC做了太多封装,掩盖了事实的真相,^_^)。通过控制台我们可以很快
w8N @qw0地学习C++语言中的很多新特性。如类的封装、继承和多态等。通过这个时期的学习,要LUPA开源社区+Mefe*K~
能够掌握三个东西: C++关键字、语法(重点是和面向对象有关的,以及模板)、C++LUPA开源社区!i&zdYAP_P-jT5M
标准程序库(知道怎么使用即可,要彻底掌握需要很多时间和精力)。至于与界面有关的LUPA开源社区| c*n3Yx,I W*l'kj
东东(MFC中很大一部分是与界面相关的类,所以我认为MFC很臃肿而无聊!回头看过以前LUPA开源社区%S"i/v"~9["I/x
用MFC写的程序,有一种“垃圾”的感觉。)
@^2R1tX2eA6c s*~*g0自己做个测试:
1[6J~w @W2Y0写一个控制台程序,在其中体现出类的继承,函数重载,动态多态(通过虚函数实现),LUPA开源社区\6L)x _T@R'_Y
数据封装,C++标准库的运用。LUPA开源社区{ Cca+G(k;o+@o8h6yd?8f
如果你能够轻松搞定,恭喜你,你已经通过C++语言关了。不过C++实在是一个复杂的LUPA开源社区*q&P brIs9K!_
东东,其中有各种千奇百怪的语法现象,如果没有三、五年的功力,千万不要说自己懂C+LUPA开源社区.|+Mk\rW.]Qv7}j
+。^_^。
E q(i}"b)d;_!F{ Xj0推荐书籍《Thinking in C++》(有精力的话,可以直接读原版)LUPA开源社区 O y$lZ[^
《Essential C++》
LUPA开源社区r6W:kER6cY,|

LUPA开源社区*R-g\:W*iG

本来我计划继续说说如何来进入C++世界的,但是琢磨了一下,觉得还是要先解决一个问LUPA开源社区q(kF:KSGP
题:为什么要学习C++?我觉得在软件开发这个行当了里除了为了生计外,学习新东西都
v8c'FD8O-No$F_IB0是应该以兴趣为导向的。所以撇开我个人对C++的偏爱,我想为你树立起学习C++的信LUPA开源社区9e4G z bL\f&n!E
心和兴趣。当初我对自己学习C++的第一个忠告就是:不能半途而废!起初是兴趣驱动,LUPA开源社区dG0y [O
后来则是生计所需,最后还是回归到了兴趣。毕竟我从中得到了乐趣,这就足够了。在学LUPA开源社区"w:R^#d:~Fk:`}
一个新东西前,解决动机问题很重要。就如同杀人一样,如果只是突然兴起,那么等尝试LUPA开源社区A[3i e qI
了以后,是没有成就感的。革命先烈们为我们作出了很好的榜样,就算我们在学习C++的
n7`4Dag7b`8Iz0道路上遇到了太多困惑和痛苦,但是我们毕竟为自己的信念做了努力,我们知道自己在LUPA开源社区m(W-IV/[9wRot
做什么,知道自己在追求什么。

*I}O@SKx4y0

t%R n^%w6Q0C++适合做什么样的开发?LUPA开源社区 BkG/d4c W
C++是一门广泛用于工业软件研发的大型语言。具有很高的复杂性和解决问题的能力。CLUPA开源社区(C G{^i|6f
++不仅在开发上极具价值,同时在学术界也就有很高的价值。有关C++的文章应该可以LUPA开源社区6R _[@M!z&t1]r\_
用浩如烟海来形容了吧。C++的世界级经典书籍也是数不胜数。然而,目前开发语言是如LUPA开源社区!w{{R3O Zh+B
此地繁荣,就连微软也在推出了新的开发语言C#。一个不可否认的现实是,在低阶程序设
(D9M0{ {E0计领域,C++挤压着C同时也在承受着C的强烈反弹,前段时间看了据说是微软操作系统源代
Lh@1T,}V+P)y6Ic*i0码的东东,其中很多还是C语言。而在高阶程序设计领域,Java和C#正在不断蚕食着C++的
'Z[9e+z$?!U*qF.@"A0地盘。也许Java和C#的狂潮终将迫使C++回归本位— 回到它有着根本性优势的开发领域:
3x/wtrvc lh0低级系统程序设计、高级大规模高性能应用设计、嵌入式程序设计、通用程序设计以及数
^8X0i;K(I)^c3Y0值科学计算等。果真如此,我认为这未尝不是一件好事。电力系统软件所要求的高性能和LUPA开源社区pJx LA7X
大规模数值计算正是C++所擅长的。就我所接触的南瑞和鲁能,很多涉及到电力系统计算
)g5_)Xp%O9bfE0的软件如PAS等,都是用C++来开发的。在电力系统软件开发这块阵地,C++大有用武之LUPA开源社区y&Y#OzyJ
地。C++吸引如此之多的智力投入,以至于这个领域的优秀作品,包括重量级的软件产品、
8k9@"iQXNC@0程序库以及书籍等,数不胜数。在C++之父Bjarne Stroustrup的个人主页上,有一页
/b F*|S0a;n(P9E;Y0列出了一些(全部或大部分)使用C++编写的系统、应用程序和库。
H s3XE1S3W0下面是一些例子(摘自荣耀网站):LUPA开源社区-GCd`T#w
o Adobe Systems:所有主要应用程序都使用C++开发而成,比如Photoshop & ImageReadyLUPA开源社区 I6W5]f~1f
、Illustrator和Acrobat等。
R'ES6@E s#?;P0o Maya:知道“蜘蛛人”、“指环王”的电脑特技是使用什么软件做出来的吗?没错,就LUPA开源社区&Ca\7F,K7r[Ic5X5o
是Maya。LUPA开源社区5D4I!L*[%yJ+l!_;u
o Amazon.com:使用C++开发大型电子商务软件。LUPA开源社区CwQ/Sn6y'i
o Apple:部分重要“零件”采用C++编写而成。LUPA开源社区(U5Z'CyI*J%Ri3r+F
o AT&T:美国最大的电讯技术提供商,主要产品采用C++开发。LUPA开源社区.~*_V(n-}
o Google:Web搜索引擎采用C++编写。
.I'{?#QBC0o IBM:OS/400。
r^+uB:Q0o Microsoft:以下产品主要采用C++(Visual C++)编写:
&PICZ2ELvw0o Windows XP Windows NT:NT4、2000 Windows 9x:95、98、Me Microsoft
!@#Cn4`U:^ Nw1qP/s0Office:Wo
kjBj4hP7Q,V#k}6N0rd、Excel、Access、PowerPoint、Outlook Internet Explorer,包括Outlook LUPA开源社区r!Uu^ k$aFUPB[
Express
Q-B'JP.G;z1_d0Visual Studio:Visual C++、Visual Basic、Visual FoxPro .NET
&w!S O\vA0Framework类库采用CLUPA开源社区 u,Ehg2{+O&i
#编写,但C#编译器自身则使用C++编写而成。Exchange SQL Server FrontPage Project LUPA开源社区't VG9Z)g)n2t
所有游戏......LUPA开源社区 e"I3p(H:h5`+u
o KDE:K Desktop Environment(Linux)。LUPA开源社区#v*LU7[9qz#o
o Symbian OS:最流行的蜂窝电话OS之一。
LUPA开源社区c-O WLxs%L$@

LUPA开源社区#T'x Zp+bi)C S

很多新手特别容易会对自己所学习的东东产生疑惑、迷茫。觉得自己学这个东西,花了这
kw;l.^3@#@O0么多时间有没有用,会不会过时?这种思想很普遍。在一些论坛上经常会看到一些各语言LUPA开源社区$wD!ID,p0t\.h
的优劣比较,知道自己所学语言的优劣也好,但是如果一味停留在这个层面就没有用了。LUPA开源社区 T*F;J!hX
任何语言都只是工具而已。重要的是使用工具的人!就我个人的经验来讲,真正处于业界
*] IW9Vo)g@0搞开发的人都愿意使用成熟的、为自己所熟知的技术来完成工作。而新手都喜欢用一些比LUPA开源社区 C+n q)r}1w7G
较新的技术来做开发,而且喜欢追求新奇(从界面很容易看出来,花花绿绿的界面多半出LUPA开源社区.X+a*XN&XR g
自新手)。其实,安于用一些效率可能低下、扩展性和维护性差的方法来解决问题并不是LUPA开源社区@2`(LysN
开发人员的错。他们只是在完成工作而已。但是作为一个真正有上进心的开发人员,我们LUPA开源社区u|u2J5Z
应该使用更优雅和高效的编程技术,这才是我们逐渐变成编程“大牛”的好习惯。老是停留在
1}&la4mx,hh!XMMS0原地,很容易被淘汰的。在软件开发这个行当,尤其如此。无论是对学生,还是一线开发LUPA开源社区p TZm]-@/SH^A4zQ_
人员,我觉得都不应该产生“书读够了”的感叹!我有时候喜欢将以前看过的书翻出来再LUPA开源社区QT0_2m^
看,每次总能体会到一些新东西。有关C++语言的书籍更是如此,而且我觉得我所起的题LUPA开源社区s!b SM0gt-e
目不是很好。为什么?因为我觉得学习语言还只是新手跨入软件开发“地狱”的第一步,LUPA开源社区$[p0ys'_,m
单单学习语言本身是远远不够的,还要学习相关的程序库(C++当然首选是先学习C++标准LUPA开源社区do&g)w$D*NM
程序库)、相关的平台技术(如.NET),说得更远一点,还要锻炼对目标问题的分析、LUPA开源社区w ITP kv&wLX$L e
归纳能力等等。工作之前,技术路线自己作主,工作之后,绝大多数程序员将被公司技术LUPA开源社区0kjjthH
路线左右。所以,趁现在还有时间,可以学一些自己感兴趣的。如果想搞软件开发,特别是LUPA开源社区5f#| LY(y2^'p4q
电力系统软件的开发,学好C++不会令我们失望。当我们进入C++的前门,然后经过一段
:f/ev t,EWZ LM0黑暗之路,再从后门出来到达光明顶后,我们会体味到“一览众山小”的感觉。
LUPA开源社区 }mE.| QNb ZM

LUPA开源社区-` w@ZVCS:Qu

推荐书籍:
3Y'S&m+s*JA:y?iY0《编程高手箴言》梁肇新(用过超级解霸的都应该知道吧,^_^)写的第一本书,其中有几
yW4o4_/VjQ[0章还是值得一读的。在这本书中,梁告诉我们,学东西要耐心,要耐得住“寂寞”,走自
E7S`x8OG0己的路,让别人去“说”吧!

#@'t!Mw,|0 LUPA开源社区1S"R;q-ydz"r

最近比较忙,原来打算紧扣主题讲讲一些具体的C++语言的细节的,但还是抽不出大段的
`Dnu5bhl0时间了。所以,现在只能再漫谈一些关于C++的故事了。

(X K U0tgyI6j*~r0

f0~dc/?9fZL0C++源于C语言,还记得很久以前学习C语言的时光(那是一段快乐而充实的时光),可是
@h%x.@ ASob0现在学习C++,并不是在C的基础上加上了类而已,如果这样认为,我们是耍不好C++的LUPA开源社区A7_0m+\/o
。因此,C++绝不是C的升级或扩充,我们应该把C++当作一门新语言来学习(C++之
(Q:y8V%T6B;M0父Bjarne Stroustrup语)。
LUPA开源社区7p}$?B1tY

LUPA开源社区nF DA;E5{5tt

写程序首先希望是程序能正确执行,其次是效率能够被接受,再次就是易于维护。C++是LUPA开源社区.~r*Z\@,E+dcj
一个难学易用的语言。C++提供了太多可选择的东西,而且使用使用C++来写程序可以
zt8btDE-q0有四种思考模式:基于过程、基于对象、面向对象和泛型。我们使用一种语言来写程序,
Fq-zt%q?v'R n0并不意味着就是使用语言本身,换句话说,我们更多的时候是使用程序库在写程序。比如LUPA开源社区g-ciOC
MFC、STL、ATL、VCL等等。其中要使用C++来写出结构优美、性能卓越、代码简洁、易于LUPA开源社区T_:Y] O9m+D
维护的代码,首推C++标准程序库。STL对效率做了严格的要求,而且使用STL写出来的程
.vc SL'T b5B_0序简洁美观(前段时间我特意贴了一个要求对若干整数进行排序的帖子,其实目的就是用来LUPA开源社区8m-B$sG&f'Y
展示STL的简洁优雅)。一旦习惯使用泛型思维来考虑问题,我们能够充分体会到模板带来的美!LUPA开源社区ZW2F+c1B/haY
对于数值计算来说,C++标准程序库可以充分满足现代化服务和商业计算对数据、信息的即
h1p|&x Nfe0时回应的要求。

;v&Tsu'M6I]? BZW0 LUPA开源社区0c!g!mM;h@&D

我觉得学好一门语言最重要的就是实践。也就是多“写”!“工程经验之积累”对已具有LUPA开源社区#C N+tv7s{
一段开发时间的程序员而言,非常重要!只有在不断的积累中,我们才能渐渐体会到C++
8I |9XU/k@8Y$f']:oN0语言中的一些背后的东西。对于这点,没有大量程序代码写作经验的菜鸟,也可以借助《
}$z WUdf2MJ(x'u0Effective C++》先攒一些经验值。《Effective C++》是一本好书!。Meyers的书绝对值
'L)Y$Ac dHRf0得一读,Meyers可以说当今C++社群中数一数二的技术专家。

Z \6`U%Kc*H;D0

WT;{0u*Yny0推荐网站:LUPA开源社区^Le["i BRj
www.royaloo.comLUPA开源社区2`"g|1lh_+H2[lX
                                       
/~^/f9ck,c]0以下文字应该是去年所涂鸦而成,主要是关于动态内存分配的,在这里将其重新看了看
H+f|(W3d0,觉得还是写得太浅薄了。因为内存是程序运行的“运动场”,对场地的了解程度会直接LUPA开源社区q!S"I,~X
影响到我们程序运行的流畅度和稳定性。
D-?]7SB)G^0    C++提供了操作符new来在堆上分配内存,操作符delete来释放内存。有些情况下,我LUPA开源社区2^y t|/~f@(n
们需要对内存的分配和释放进行更好的控制。许多程序创建和释放一些重要类的大量的对LUPA开源社区 p8g ~(Y @LQx
象,如tree nodes,linked lists links,points,lines,messages,etc.使用通用的内存分LUPA开源社区3p-G4g W(yE-NG?p#ad
配器如new和delete来进行这些对象的分配和释放有时将支配程序的运行时间和内存需求。LUPA开源社区 dk#_*xAL;B[
两方面的因素:通用内存分配操作的运行和空间的耗费以及不同对象大小引起的内存碎片LUPA开源社区 ]*CzS4Tf
。类使用定制的内存分配器将加快模拟器、编译器和类似程序的执行速度。LUPA开源社区$YG#F _1p
    例外一种需要更好的内存控制的情况是:需要在有限资源的情况下长时间不间断运行LUPA开源社区$I)@&_ G_T(sko
的程序。实时系统经常需要用最少的耗费来获取有保证的可预期的内存。这也就导致了更
c r,Dsm8o0好的内存控制的需要。一般来说,这些程序都避免使用动态的内存分配,而使用特殊目的
;|&r6W$wt0的内存分配器来管理有限资源。LUPA开源社区U.\!Pat%Pkjm
   此外,还有一些情况下由于硬件或系统的要求,需要将对象放在指定的内存位置。这也
)mb-Buw0需要进行定制的内存管理(通过重载new来加以实现)。LUPA开源社区\0WX_}.W H
   在C++ Release 2.0中,为了满足以上需求,内存管理机制做了相应的修改。主要是引
r#yA QC$L8k5nH0进了operator new [] 和 operator delete []。LUPA开源社区`2]1B-i y(n9Dj)a6v%j
   new操作符的作用范围(Scope for operator new Functions)
1I(fu;PM'c0   操作符(Operator)         范围(Scope) LUPA开源社区?ti6d)@2HF5d z!u
   ::operator new           Global LUPA开源社区?s;H%P:@/F
   class-name::operator new Class
.R-LD*Tc~(G%l0   operator new的第一个参数必须是类型size_t(在STDDEF.H中定义的类型),返回类型LUPA开源社区)CLd+g.xDZ
为void *。LUPA开源社区bfeX~,O$^
当分配内建(built-in)类型的对象、未包含用户自定义的new操作符函数的类对象、任何LUPA开源社区]!g5qf6FtH2bHYW
类型的数组时,使用全局new操作符函数。当在类中自定义new操作符时,分配该类对象的
gL4@^$t5PB0内存时,调用该类的new操作符。如下:
7r'p)f%EM0#include
B Jw1jiM,IL7i0#include
&eU I:nu/F S0class Blanks
h}jH3?'e.oU'g0{
Zr9un+w}+T0public:LUPA开源社区d4Z a&\MDaZTZ _U(_
Blanks(){}LUPA开源社区M$}o+`]8S5eD[
void *operator new( size_t stAllocateBlock, char chInit );
k,y xWO1v0MZde0};LUPA开源社区g9sK&Q'c0f MjN
void *Blanks::operator new( size_t stAllocateBlock, char chInit )LUPA开源社区 B6E t,XVH|H
{LUPA开源社区e;^]3oyWx?
void *pvTemp = malloc( stAllocateBlock );LUPA开源社区Y6dNlz/_r`
if( pvTemp != 0 )
E.tu'N4J!y%BN(i)S0memset( pvTemp, chInit, stAllocateBlock );
_2@7Kz)N:??0return pvTemp;
A*H^QI3{oK0}
SWF6D-Bk0int main()
}VB6\lMF0{LUPA开源社区L(@|DT4tM!E)Md
Blanks *a5 = new( 0xa5 ) Blanks;//创建对象Blanks,并且初试化为0xa5LUPA开源社区u\ u2^"h0u$\ `P
return a5 != 0;
$H^\ POl.YXcu"L0}
I/VQ ds)d"?d{x0   new操作符可以重载,而delete却不行。因为等到需要释放的时候,我们所能得到的就
c6O*l?;`5er0是一个指针。而且该指针可能不是原先的对象类型指针(有可能进行了类型转换)。实际
&^!`M0W!nl eHc0上,当使用new获得一个指向一片内存的指针时,在该片内存前有一个指示器(indicator)LUPA开源社区p&s0P H S4}
,记录实际分配的内存数量。当调用delete时,可以获知需要释放的内存大小。
1NB&dQe0数组的释放(Deallocating Arrays):LUPA开源社区0`$OL'e y|9C5J
void f( )LUPA开源社区C[ma,S
{
Z U1b\;Xhfu:t0X* p1 = new X[10];
b:Fik1{+jJ GU8j0//...
3rOE#j5]Y&fo4U mh0delete [] X;LUPA开源社区2aa+~b!ZC
}LUPA开源社区w5Rds|gC
   为什么不使用delete [10] X;来释放内存?Bjarne Stroustrup称这种做法容易导致错
`])c4hr:I*s%W0误,而将记录元素个数的任务放在delete的实现中了。LUPA开源社区8WlZf9I&z!e
   至于为什么C++中未内建垃圾收集器(Garbage Collection)的原因,看《C++语言的设
d z&T`Js!Icgl0计和演化》(En) Bjarne Stroustrup 机械工业出版社(俗称:D&E)可以得到答案。
c'~?+Wof0   此外,C++标准库中提供了一种智能型指针auto_ptr,这种指针可以帮助我们防止“被LUPA开源社区 a4?;N2K#_
异常抛出时发生资源泄漏”。但是缺点是该智能型指针不能指向数组,因为其内部释放内LUPA开源社区)a6?%R&C3e!v?-z
存是通过delete而非delete [] 来进行的。所以,只能使用其来指向一个单个对象。

2_8X#Pz,C0d2B r0

P8d U,_%{6Z9|$o0模板部分是C++中比较难的部分,也是C++的魅力所在。以下文字是我以前看过的,具
B7VQSl3NT.q.x0体出处不清楚了。今天稍微整理了一下,作为模板介绍的一个单元。
LUPA开源社区8R:z;e ?8Tn!xN O

LUPA开源社区Y'hM:V;K Rz3R^

为什么要使用模板

Xx2\;dz ]&^0 LUPA开源社区%|;kpsH

对于除类型之外,其余都相同的函数(譬如quicksort),我们一般有3种解决办法。
kb#y0}dxm!Q01、针对每个不同的类型重复地编写函数实体(C语言的做法):LUPA开源社区8N2kL.cw:? qes
int* quicksort(int a[]) {... }LUPA开源社区e/w7b/`YA R-R:c
double* quicksort(double a[]) {... }
Q){\}if0
,e!N9A9W+DL02、使用Object(Java的做法)或者void*
V'H l_:h0缺点有两个LUPA开源社区(^WXqK0h/x
效率问题方面也有问题LUPA开源社区5b Pw8yFK~8D8|
类型检查问题LUPA开源社区0]W&L:kn0q
3、使用宏预处理机制
)e8FU;{*P0缺点:只是愚蠢的文本替换,而且也不会考虑作用域和类型安全。
aI cQ5h pB0然而,应用模板却可以避免这些缺点,我们可以编写:LUPA开源社区;L*Cj6{ K$zl5]
template
%htiJ&vV0T* quicksort(T a[]) {... }LUPA开源社区[_Dl%GW${ J1h9\
优点:
6n1u(n#Q)Lp2g+g0代码简洁优雅,所有参数类型都以T来代替,真正实现了类型无关性。
E CH"Hg:jy&^'V0更好的类型安全性,所有的类型检查都是在编译期进行,而且避免使
N!u.H%@WhBX0用指针。LUPA开源社区5EW!q4J9^'])`E
不存在继承,效率高。(1)没有虚函数;(2)所有的一切工作都是LUPA开源社区\9R4oW"e,z%V$B?
在编译期完成,大大提高运行效率。
cH$]`F0目的:告诉编译器如何做出最佳的选择,而且这种选择LUPA开源社区 { J(Bh+ku"o
全部是在编译期完成的。

o_uA7@ @7S0 LUPA开源社区:RH%s Y kA6J m9`

模板的机制:特化 和 实参演绎
9y8y.{ L"r3A^}]01、特化LUPA开源社区3di:Ik.sC N4}x \
基本模板:LUPA开源社区0I9P J7l4? `'l
templateLUPA开源社区6Dh"U5xoM,h A
class A { // (1)
QP&q_cfT0void f(T1 a, T2 b);
/ig8JUl0}
wE-TK8f;|r0局部特化(偏特化):LUPA开源社区2YcdS;y | \o
template class A { // (2)LUPA开源社区i5GL)\s ~Wa0V"]&u
void f(int a, T2 b);LUPA开源社区!oQrD#Z,oi{,k
}
C%W:z,Ked'q"O0或者LUPA开源社区/WHvk"} _[
template> class A { // (3)LUPA开源社区 E}W7{!};O@pl'\.G
void f(T a, T b);LUPA开源社区R!C/WGiv z
}LUPA开源社区QkFeGU2\0`
全局特化(显式特化):
A]C#K%FC#\#F0template<>LUPA开源社区)~w[z1_)W*v,X
class A {
~+yFfYL0void f(int a, int b); // (4)LUPA开源社区 wu7Bu.ay}
}LUPA开源社区#HOS~fD \8z2_2K
使用示例:LUPA开源社区t3L0F$M [up
A* p1; //将使用(4) ——全局特化LUPA开源社区+{.Dgmo*yO.~
A* p2; //将使用(3) ——局部特化
Q7aLh NJx8Rj0A* p3; //将使用(2) ——局部特化LUPA开源社区.I{:W/HI6m0RW1w
A* p4; //将由(1) ——基本模板——生成LUPA开源社区\k|Z w;\
//ALUPA开源社区(Vc%fT~5u.La9r/_
优点:LUPA开源社区~ iR1M {;@ oT
  由:全局特化->局部特化->基本模板,这种特化顺序的选择与匹配(重载解析规则)是由编译器自动进行的,无需人工参与。
7n o4A I |9{&B`R0  可以根据不同的情况(诸如类型不同,条件不同),给出不同的实现,从而获得更加灵活的针对性。
0^^N-OS)wZ0  可以针对任何变化,改善了程序的扩展性。
M}"T$s.Y,tV.@1o02 实参演绎LUPA开源社区.~*w(c#Wf$e,N4u
T const& f(T const& a, T const& b)
(`1^)V"g]u x0{
/| G bn7E1cU5p0return a + b; //1处LUPA开源社区#EN}iA
}
eoS8O_sc0int g = f(1,2);LUPA开源社区2r$J;}0Y N-x
实际上f(1,2)要匹配的函数是int const& f(int const&,int const&);LUPA开源社区YdDut#WK.u
而这个函数又是怎么来的呢?LUPA开源社区5|o+koZU7bR [
优点:LUPA开源社区UK)v;n2[|
再也无需提供一对尖括号和里面的实参,诸如f(1,2),有了LUPA开源社区 MI|;_Rsx
实参演绎,我们就可以写成f(1,2)。
LUPA开源社区ot\GW'x/^ {R

Fm5h.GF!Z0模板的应用LUPA开源社区,~ Bv ]\"PdW
1、标准库(STL)——到处都是模板代码
dg S/~5D1Gd/@.L&U0标准库=算法+容器+迭代器LUPA开源社区9hi{5tv}w
如list /
g|lQ7uI5u3g02、类型无关性(T)LUPA开源社区.V @uz(cS_5{ F
3、trait和policyLUPA开源社区/B{'~ LFe+LcI
(1)trait: 主要用到了许多typedef和特化,指定的是一种特性。
5JN Erg:HsC j`0// traits/accumtraits3.hppLUPA开源社区pp+EFI4f_9J*g#Gp
template
6K.p;ac f o7Ha M!`0lass AccumulationTraits;
.[vvh;s,a-A8m M0c template<>LUPA开源社区2y;t w-cD1R{
class AccumulationTraits {
Jz |@*`T"c0public:LUPA开源社区{m1x.zj@H0~ g
typedef int AccT;
.E y)m%XXn-y;lj0static AccT const zero = 0;
~4r iS\^0};LUPA开源社区7~5v7piQAv7l
template<>LUPA开源社区4M8BP#W-X:e5D
class AccumulationTraits {
:A;I/mHcB e&@0public:
'Lu} `y p|:^0typedef int AccT;LUPA开源社区.U g`3Tx7v'_2e8~v:nj
static AccT const zero = 0;
q$f}YGg1wW[$\0};
.|8].RqvV0template<>
}_]6OP]c5^0class AccumulationTraits {LUPA开源社区&j$L.Pq\8dZ
public:
R-_c)u e0typedef long AccT;
3C(U,B&\*lfx0static AccT const zero = 0;
'F3A^;NK.Ai0w0};LUPA开源社区 e*s"X];BB]"^
(2)policy:通常表现为某个函数,指定的是一种行为LUPA开源社区9io4|}'gC.eD
class SumPolicy {
z&_/KyO0public:
1ur$L^X0templateLUPA开源社区,cK4pp^M^ f
static void accumulate (T1& total, T2 const & value) {
^-i}|@ qf%G4r0total += value;LUPA开源社区J eb0@1ZasA4Z;HE
}LUPA开源社区G$Cd x \OMwu'A
};
3A T!Z*G#N0(3)trait和policy的用法:
wu uE~/y0template  >
M2MX3Z;m5a0class Accum {
Y n(NDO,U}0public:LUPA开源社区 srGL'w!K
typedef typename Traits::AccT AccT;
8PP4cy)iiL0static AccT accum (T const* beg, T const* end) {LUPA开源社区l#\;q"PsF
AccT total = Traits::zero();LUPA开源社区(}C Y2~!aS d#i3^8Fk
while (beg != end) {
&^ h ?5hk;_e$j0Policy::accumulate(total, *beg);
6QEtV3pX0++beg;
D;F!]XD Rg0}
:} l L&bM0return total;
P5A(QK,cc!oE0}LUPA开源社区;bGXt_{7I
};LUPA开源社区w-w9E"y,^Y |\
4、MetaprogrammingLUPA开源社区VRxg.Vpm
编译期计算、递归的思想
:og-S:V+vp2g?O05、新形式的设计模板LUPA开源社区 pqF}v6O5_'N[
(第三、第四、第五点以后再详细介绍)
LUPA开源社区9\rS!R#a j-K bn%n_

B8i5T&B0iRu0《C++ Templates中文版》的具体介绍LUPA开源社区2z4w3q6B|*N y#W/c
  第1部分介绍了模板的基本概念,以教程的风格来介绍这些基本概念。LUPA开源社区#wz Q#{Y
  第2部分阐述了模板的语言细节,可以作为一本基于模板的构造的参考手册。
&^2`] iDN%L:O0  第3部分介绍了C++模板所支持的基本设计技术,范围覆盖从微小的概念一直延伸到复杂的用法;一些技术在别的书籍都没有出现过。
%m'`p0ip3M(L0  第4部分基于前两部分,深入讨论了各种使用模板的普通应用程序。
} p!~ z|C'F4H[0                                       LUPA开源社区@A/K,XA7u
发信人: robindy (丁丁), 信区: EESLUPA开源社区DQG-` r(S9\v
标  题: Re: vc要学多久呀?那位大哥给个说法?Thank you!
E [`/d]mF:LyYf0发信站: 水上明珠 (Sat Jun 12 19:19:31 2004)

5EM }'L-z*B6YV(I7kk0

"CL1Ppb'_%Q I8~-{Z0学一个月,可以用VC写一些小程序自己玩玩LUPA开源社区S(mP3x3k?
学两个月,可以用VC写像样点的东西在周围人面前炫炫
BD/n(v!FIf0学三个月,可以用VC给老板开始干活了
C0F:zX-XD a t$XOL4B T0学六个月,开始重头去学C++
5E/m&I+Mq0学一年后,决定要不要继续,if(继续) 学习MFC、ATL、STL、C#、BCB、Network、DatabaLUPA开源社区9s:@ xJ)I7](qZ
se、Algorithm... else  开始就是个错误
OENt j/wgb6x a:Fx0学三年后,学会怎么来用编程语言来解决问题,VC、BCB等都只是解决问题的工具。这时候LUPA开源社区 ED0ez#^*`%i1]
你如果还在学C++,你可以从事软件开发这个很有“前途”的职业了。

B!D R/F z UD0

/M2M7zlM;RZHC k0 

]sfg!O6z0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-11-21  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 7311
  • 日志数: 16
  • 图片数: 3
  • 文件数: 12
  • 书签数: 4
  • 建立时间: 2007-06-28
  • 更新时间: 2007-11-07

RSS订阅

Open Toolbar