找回密码
 立即加入
搜索

查看: 940|回复: 4

简述C和C++程序员学习历程【转贴】

[复制链接]
猴老大 发表于 2009-10-18 19:59:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转闽南师范大学。

您需要 登录 才可以下载或查看,没有账号?立即加入

×
哈哈!有幸在某网站发现这篇文章,读罢,觉得蛮有道理,发来大家一起共勉之   
& i4 y4 |$ D& I4 |1 I1 g* Y( B7 N# M* N. e+ Z# w
8 O" l6 I0 d# S6 S
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。
$ p- f+ t, T4 f. g" H; A# v! p; {
- O) [% ~- B6 W6 O# U, E2 H: b, s  一家之言,欢迎拍砖哈。 7 i. o& d8 U' ~) f# R. y  O
, q3 O/ }8 \/ ~& r# j" x- L
  1、可以考虑先学习C.
$ |0 m. a" s( f" U# N% [2 f  e# _) \( Y5 q
  大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。
2 h  U% l0 u$ C( x" r0 s. @6 e4 _3 `
" z( W  E) ^2 a) g. c; s+ _9 D& d" t. Q9 W. G3 _
  C++是C的一个面向对象的解释,C++为C扩充了大规模工程应用,复杂的系统结构的组织和掌控方法,但是,我认为,C++骨子里还是C的。
6 m! {& r1 C0 @# T/ D5 P+ m" B$ {& M( n" M! d. t' M
  毕竟,解决具体问题,每个函数内部,都是用C的方式写程序,还是面向过程的。
3 b$ k1 G1 j0 q4 x3 {* j# o7 [8 P( O8 M+ v( N( _
  因此,想要学习好C++,我的建议,先学习C,先学解决问题的能力,再讨论解决大问题的能力。就是先学习怎么走路,再学习怎么跑步。
( @1 {: L# p8 F; Z8 O
: Y$ o2 m5 A" I+ [' u  2、学习C的过程中,一定要理解结构化编程思维。 8 }1 W/ D5 z5 P) ]9 b( |

, a; }- T% }9 A" I  为什么呢,我前面有文章说过,软件语言的发展过程,就是一个数据私有化的过程,大型工程应用,强调高内聚,低耦合,模块化设计,保持代码最大的灵活性和安全性。 , |: s* T7 u0 H3 U- }( D/ p
这是现代工程化开发的核心和灵魂。 0 ~& W9 D4 o" p

  I) X3 M7 |' g& k7 V3 m  因此,利用C这门语言入门,借此理解结构化开发思维,可以说是个很方便的路子。因为C的函数,本来就是为重用做准备的。同时,全局变量和cpp内部私有变量的差别,其使用原则,这些都能学到很多结构化开发思维。 , R( p6 P6 E" \3 m' [0 \
- p4 F' b. j$ {6 Q$ l7 V! Q) @7 t8 X
  3、开始学习C++ ; F+ b# a0 y' }2 _- y0 [% x
; X: B2 {1 P0 J5 t) m2 ?
  C++不难学的,很多人觉得C++难学,其实是因为它在C之外,又提供了很多的概念,尤其是对象,很难以理解。 & _9 T) D, W4 Z- n; g4 h
7 t( d  \2 A, w- [' j* y* D
  不过我经过这么多年,把这个问题反而看淡了,我认为面向对象相对面向过程,仅仅是结构化程序设计的一个具体体现,是编译器提供手段,强迫程序员必须遵循数据私有化的一个实例,C++和C的关系,最核心的莫过于此。
  P8 W+ f8 G2 @6 i2 O. c" t) l; ?
0 `, C8 x9 h$ P( z+ [& w  现在我们回到C再看看,如果我们把一个全局变量,写到一个cpp里面,并且在对应的h文件中不声明,它是不是就只有这个模块可以使用?它是不是就是私有变量,以这个理解,类能明白了吗?
# S5 j) S  E; W; q8 q) T3 A! t
3 l" f, K! B5 q7 B  P4 M+ j6 U/ `  4、学习C++的深入技巧
& f5 \6 v9 z& M( f# g! d& z/ B7 k* w7 V( b1 I! @
  C++在类的基础上,经过这么多年的发展,其实提供了很多深入的概念,看起来很复杂,其实我看也很简单。比如模板,我的理解就是“类的类”,大家说是不是? % a( |0 g$ D6 b/ Y* _: g  q

7 t( P" X% ~- H, i  既然模板理解了,STL,ATL这些,静态模板库,动态模板库,还难理解吗?就是一大堆类的类,可以借此实现很多应用中需要的类,不需要程序员再自己写而已。 / W% P8 v# i  {
/ {, U6 e, Z7 H8 M4 z7 a
  ok,STL都理解了,泛型开发还难吗?所谓泛型开发,其实就是我做一个模板,来定义一套算法规则,但是呢,我希望这个算法规则,能进一步抽象,对核心数据类型不要限死,我把各种数据套进去,都可以用,这样,仅算法这部分,我不需要重写了。你想想是不是这个道理?
4 N% j% F8 Q. o8 m' {+ T+ b1 A, i3 B( E+ n, ^
  学到这里,C++和C,其实已经差不多了。再学语言,就是求全责备,过于钻牛角尖了。
8 v5 I$ W. A$ W# k- a0 o
. U8 y( D4 B: J% T; f; J( x  G  5、学习应用开发
7 g, L) d! F! F
4 M" m0 T: S/ @6 w! G9 b; v  前面说了,学习语言,目的不是让别人认为自己是专家,是为了写程序赚钱。因此,语言学完,要学习应用开发。 ) C$ @* S( \6 ^! K( K. r6 T' |

( c$ @5 }' U. ]! l8 U9 E  什么叫应用开发呢,我会一门语言,但是,客户不懂,客户说的很直接,在Windows下给我写个程序,我要什么什么功能。为啥Windows呢?因为我习惯。   E7 i4 Z0 R6 ]! B, d  M2 [$ Y

: Q' _( ?/ X  \/ }6 U0 x. ]  OK,很多时候,应用开发要尊重客户习惯,一般说来,语言这个东东,还是要结合具体平台的开发,才能开发出有意义的应用程序卖钱。那么,一般说来,客户端是Windows系统,服务器是Linux,这些都是行业习惯,嵌入式不好说,各种平台都有,Palm,S60,Linux,WinCE,等等。要根据自己的目标客户来定。 ' G7 Q# @  E0 L& W! \  m# a/ w
. }4 }- ?" n* @4 {# t
  当我们选定目标平台后,有一个问题,选什么语言,很多时候,学生和商用程序员差别就在这里,学生一般没得选,自己会啥就用啥呗,企业里的程序员不会,要先评估需求,看哪个语言更合适,不会的语言,要去学。 8 G$ N' H& e6 y1 M0 m+ b

0 {6 \2 x* s' a8 H7 j5 h  ok,假定我们选了C和C++,那么,我们需要选择开发平台,Windows下不用说了,VC,这是最好用的,Linux下呢,gcc,其他的也差不多。 - E6 B1 ?: m0 E# }! W
, u7 ~6 H; U- ?7 X  {4 w
  假如我们开发VC,并且使用C++,这个时候,才需要考虑学习MFC了,因为这是微软的标准类库,至少Windows平台下,它最权威,你看见没有,我们从学习开始,走了多少步,才走到MFC?是不是MFC不是学习C++上来就必须学的?
9 Q. P5 r/ Q& g8 D, p$ ]$ N
0 {- y; m0 {) p' I  6、学习MFC * m% @6 D/ U% j) _. d  x! [

, s* L: C+ m7 M7 C  学习MFC,很多人一上来就开始看其体系架构,看得一头雾水,那个模块关系依赖图,我到现在都看不懂。
7 y8 _- ?2 y7 l4 D( q/ j4 D: J  g- _. k# T
  呵呵,其实不是啦,和学语言一样,我们学MFC的目的,也不是希望成为MFC的专家,而是要利用MFC开发Windows应用程序,为我们赚钱。看见没?MFC是手段,不是目的,目的是开发Windows程序。
# T5 n+ y. [  K2 `6 l- ~6 |2 S1 B, q
  其实Windows下,有一套很标准的C接口,叫Win32API,这个才是Windows的标准编程核心,因此,学习MFC,真实的目的是理解Windows程序开发,建议可以先学习Win32API,看来我们又回到C了哈,呵呵。刚开始学C有用吧?
2 {; z$ g4 d9 @! `/ d: c2 M5 s0 _7 T! i% v! ^9 Y( H% w1 Q4 l6 f
  7、Win32API 5 F$ y+ V) L% v+ {. O& n
9 k! C3 U  }5 \
  其实Win32APi不难学的,因为虽然它很大,有很多接口,但不是必须的,我们真正做个简单的Windows应用,其实用不到这么多的。做个简单的Dialog,然后实现个功能,你遇到的接口函数,其实绝大多数,就是以后常用的了。把常用的记熟练,就ok了。 * y. b( R+ Z& n& n8 [/ [

3 j( Z7 Y0 w+ c: F, D! K  关键是,这个时候要通过WinMain方式,去理解Windows的事件机制,这是核心,其实说起来简单得要死。就是以前你的程序,由于没有系统支撑,很多事必须自己做,比如检查鼠标和键盘输入,你需要写个死循环,自己不断去看,而Windows说,这些事你不要做了,我来做比你好。你没事就玩去吧,我把和你相关的消息放到一个队列里,就是你的事件队列,你自己没事去找找看,有没有新消息来,有就做事,没事就玩好了。很简单是不? 0 L* m7 v9 H+ l! P  O; e

# ~9 j. ]3 y% Y4 U1 ]/ f  当然,Windows是多任务操作系统,有时候,我们的逻辑需要并发一些功能,比如说,我在等鼠标键盘消息的时候,需要再看看打印机准备好了没有,这里就需要理解并行计算了,这和语言无关,和操作系统无关,这是另外一个话题,这里不多说了,你可以自己找找线程开发的相关资料看。
8 V! l+ W: D# P' \+ d$ n: K1 \$ i$ x# Z8 d+ t" e
  看见没,为了学习好Windows编程,其实我们不仅仅需要学习语言,还要学习操作系统,并行计算原理,内存原理,可能有时候还需要学习网络通信,等很多知识,所以说,单凭学习语言,是成不了商用程序员的,一个合格的程序员,需要理解的东西,太多了,要广为学习。
5 q$ l! H% d- ?! m! D3 E# J
; P+ w9 g. i( k  f' Y; d! |7 V  当我们把Win32API,以及基本的窗口化程序设计理解了,就可以回到MFC继续学习了。是不是有点递归返回的意思?呵呵。 ! S3 W3 v6 H/ l, m# X
, v7 z6 x# l8 c( V; Z
  8、回到MFC 8 n, w. v$ j  _, K' g

1 K4 s( l9 q# q  原来学MFC很难的,因为其封装了太多细节,很难理解透彻。不过还好,我们有侯老师的深入浅出MFC,去找本来看看,如何从Win32API的纯C编程,改变为MFC的C++方式,看这个最快,基本上前6章看完,已经会了,这里我就不多说了。
% S) n/ }. c5 y: _! L5 \2 c
! i, w/ R8 V, o8 d% v( e0 X  9、COM ' M  T1 a3 z9 [
' u8 R7 F+ u- _! Z! o0 \$ L
  COM、COM、COM,我最头疼的COM,呵呵。 6 e: Y% g4 _( j/ Y/ R" o7 @& m
0 U2 l  t5 z( Y3 ~( E& [( Z
  COM就是一种远程过程调用,即你请求的代码是在另外一个进程中运行的,通过某种通信协议来回传递参数和结果。仅此而已。DCOM进了一步,服务者可以在另外一台计算机上。在公司开发中,大家可能各做一块,如果要合作,Windows下建议多使用COM.(我个人喜欢socket通信哈)
+ d  k, p3 V! h1 i* H" y9 s0 N" s, k* k. y1 r% y
  简单说,COM提供了一种机制,可以跨进程通信,甚至跨机器通信。不过,为了传递各种类型的参数,COM可谓是无所不用其极,它发明了智能指针,可以指向任何类型的数据,同时,为了实现智能指针,它使用了大量的C++泛型设计,看见没,C++的基本功就起作用了,还用到了ATL. 5 y# z4 P+ ?/ p9 A3 X( M' s
' R& n8 L5 p7 ]9 h* X3 p
  学习COM,要注意一个接口的概念。由于开发者是不同的人,调用程序和服务程序,可能不是同一种语言,OK,不能简单提供一个C或C++的。h文件来解答接口,因此,COM提供了标准接口,使用者在程序内部,以查询方式获得可用接口,进而以接口ID调用。很累人的。 ' v+ }- T# `( W) G1 J6 D& r

5 u& |7 _( K8 _$ D( S2 l8 e  学会了COM,就可以多理解一点ActiveX了,那么再学习一点dll(动态链接库)的知识,我们就已经可以写OCX控件了。一般说来,OCX控件是个很好的设计,哪都能用,一个软件的模块,最理想是开发成这个样子,比exe灵活。 8 T- U: u) T6 c, q2 @* D/ h
2 v; M1 e. R1 ^3 p# K6 y
  10、没了。 ) S+ D; T7 `( L" B

8 }( T- ^  A/ R  按少林派说法,学了上述这些,其实已经算打过18铜人阵了,已经可以下山助明主,扫奸佞,扭转乾坤,解万民于倒悬了。 , z7 I2 G0 p  ?5 @2 n

% z( b; U! P9 B# V+ o  d  不过,关键是你通过上面的过程,是不是已经学会了学习的方法,再遇到新的东东,是不是已经不难学了?这大概就是武学中的悟性了,有了这个根基,以后只要慢慢修炼,估计20年后,可与天下英雄一较短长了。 . C" _- }- T! w4 W
2 n8 F! y$ _( z  p5 |7 ?
   呵呵,你说是不是? + x) h7 C. U; d+ A, @- D- v
  呼呼,好累。 & M  J$ R1 V) L8 p
+ b% g/ R5 R6 E# }8 V5 X

- t% T' ]/ b7 r本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/deerfpp/archive/2009/10/13/4666333.aspx
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
xiangxiang 发表于 2009-10-18 23:19:09 | 显示全部楼层
我是来看那架SU-?飞机的。
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

rewsna333 发表于 2009-10-18 23:22:00 | 显示全部楼层
猴老大我加你Q
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

 楼主| 猴老大 发表于 2009-10-19 17:17:01 | 显示全部楼层
楼上留QQ,我加你
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

farss 发表于 2009-12-14 22:08:01 | 显示全部楼层
希望有人一起学习Windows编程  QQ 81131452
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

手机版|龙江曦月 ( 闽ICP备05009150号-1 )闽公安网备35060202000316

GMT+8, 2025-5-26 03:56 , Processed in 0.058528 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表