C++编程规范随想录

上一篇 / 下一篇  2012-07-10 09:56:51 / 个人分类:C++

51Testing软件测试网.FFLv0S0_!od

  对于我这样一个C语言的程序员来说,编写C++的机会其实不太多。但是我还是比较喜欢写C++语言,原因主要有几个方面:51Testing软件测试网%ogD8t]8iF9X)X

5Js^"gC9b#x0  (1)自己学C++语言的时间比较长了,也比较了解,如果从大一的时候算起,现在也有小十年了;

'_8h'i| {6O ^0

a3oo;O/|W-j0  (2)windows下面的开发工具确实很好用,比如调试器调用、汇编代码查看也方便,学起来其实没有什么障碍;

_vs a^R e Y [-`0

o|4m:X`}P.N0  (3)基于C++语言的开源项目还是比较多的,比如说的eMule、webkit、notepad++、libsvm,掌握好C++语言对自己的帮助还是挺大的。51Testing软件测试网!Z&E/\U$D~1`K

51Testing软件测试网-T,[v ~+yo

  和很多朋友一样,我自己的C++学习也是非常曲折的,这其中主要有下面几个阶段。刚开始,在大一刚刚入学的时候,我们集中学习了 C++的基本语法,其实我也不清楚为什么要在大学设置C++这门这么难的语言,其实对于很多工科的同学来说,C语言已经是绰绰有余了,况且能把C语言学好 本身就已经很不错了。后面,随着C++的了解,我开始用MFC编写一些小程序,什么串口工具、聊天工具、FTP下载工具、图像处理工具等等,这个时候看得 比较多的就是侯捷的《深入浅出MFC》。当然后来随着MFC使用的频繁,对C++语言的了解也更加深入,这个时候更多地关注C++语言的实现细节,什么 《Effective C++》、《C++ Template》、《Inside the C++ object》、《Effective STL》,此时恨不得不自己会的所有技巧都用上,充分发挥C++的特性。等到工作之后,由于工作的关系更加偏重于实时操作系统, 自己对编程语言有了新的认识,不再盲目追求语言的特性,而是更注重系统的稳定、项目的开发进度和语言本身的简洁和高效。无疑,在这些要求下面,C语言就是 最佳的选择,因为你可以清楚地了解每一行语句后面CPU都帮我们做了些什么。我看过的很多操作系统代码,比如ucos、rt-thread、linux、 vxworks都是用C语言编写的,很简洁也很高效。51Testing软件测试网7D7lN5o sQ rR J

N!M@| Sb'A0  网上有位知名的朋友叫云风,早期在他写的书《我的编程感悟》当中也是对C++大加 褒奖,可是在后来的工程实践中反而感觉到C语言才是最好用的语言。相信很多的朋友都有类似的经验。当然,不可否认C++还是存在很大的市场,但是它的应用 范围和过去相比,确实是大大缩小了。一方面,精通C++的人实在是太少了,用好C++的人更是凤毛麟角;另外一方面,C++的学习代价、应用代价实在是很 高,你没有办法要求项目组里边的每个人都有很高的C++应用水平,这是没有办法做到的,就算做到了,代价是十分昂贵的。所以,为了消除彼此成员之间的差 别,很多时候C++的编程规范就变成了C语言的编程规范,这可以从google C++ style. guide可以看出来。51Testing软件测试网/D _:lg9t

)P(V _?*W N)g%w0  所以,今天这里写这篇文章,主要是就C++写一些自己的总结,谈谈自己的看法,欢迎各位提出宝贵意见。

6i^s+rE v0

)Wu6W(W`0  (1)总则

A7d]J;K xs7R0

'DMX*F)zG6?7ki0  a)尽量选择所有编译器都支持的C++标准

_E |'W4@ar0

S%W A/G:k$J(~0B0  b)必须了解类的内存分布结构

t4aJ:}#zO n0

g7rRbP7RE\7[0  c)必须了解编译器对C++的隐形操作

Yo] ZiM0

z0e2J!D"@V0  d)指针是所有错误的来源,尽量用引用代替51Testing软件测试网7Pqg(n3GpR-kSJ"N

wv Vn,_w8d0~0  e)用const对入参、出参和类函数进行限制51Testing软件测试网!p m}+\1Y

51Testing软件测试网6\-L0t9cEI7r

  f)多用namespace限定类的作用范围

cj j!RL0

?.Nz [5P)vu@0  g)少用C++的高级特性51Testing软件测试网%y%y6PI'c'y

Qna{$E u'qqd0  h)时刻在需要处理C文件的时候添加extern “C”51Testing软件测试网mM#Ps:`hv&Vp

XOqveV3m~}&~Z0  i)string类是万恶之源,尽量少用

un2b'No0lQa0

hbF](n8\U%Pu0  (2)头文件51Testing软件测试网 H9KF gVP i gC

51Testing软件测试网deis3{j c

  a)定义头文件的时候首先添加编译宏

/Ot%C_,]`9d0

#C!hzE lK1x0  b)添加最少的头文件依赖

3aR!z"|PvP0

*R`!F5e%D0rJ/uG"Dm~0  c)头文件名争取和类名一致

@/^xH UC.c/Xs051Testing软件测试网2K_2P*m/@QJFC

  d)头文件中只包括类型定义、宏定义和函数声明51Testing软件测试网3KHR!Rhe Zh

51Testing软件测试网eL3bw&J,[ R

  e)类的头文件和实现文件一一对应51Testing软件测试网 q1d['r]l-\,{/l

!q-BC xY8?B)~0  (3)命名

/{-hd4e1H8x5CY"iBB@051Testing软件测试网dtUGy4B1Za)z

  a)类的命名按照首字母大写的格式进行,比如Parent

|)uZ1K ]3h@P051Testing软件测试网n^ C{$C ab!l#b&f

  b)宏按照全大写的格式进行,比如MAX

!Q+vY\AN0

\-ON?3S0  c)函数按照小写进行,中间用连词号连接,比如get_max_number51Testing软件测试网L|;F @%y {I5\"r's]}

51Testing软件测试网w6K(X~3[3IY

  d)变量按照一个单词进行,比如number,index等等51Testing软件测试网:LWT*F%d4`V1v

:dC3\!j J0  e)变量、函数多用static限定范围,类多用namespace限定范围

Z`9xUP2_%}\y0

CU|(L6OC0  (4)函数51Testing软件测试网cnRC^2_\I!G

51Testing软件测试网PKLY*Y kK

  a)杜绝可变参的函数,不利于编译器检查51Testing软件测试网| @%c }!S?/fK

51Testing软件测试网7DQu@p{

  b)少用全局函数51Testing软件测试网?np S:r'y Y+[j

51Testing软件测试网5zd5M N;k8f|

  c)函数入参多用引用类型

F(l2l%w.@ [0

*Ih i$b-n^;i0  d)返回值多用引用类型,但是临时变量不能用引用

8cxF7R?'b8W051Testing软件测试网QK-UX(NR&^*u

  e)全局函数少用重载,最好不用

Mu(uMZ{FQ;~k/a051Testing软件测试网/D,t!u {&BK8Q(m

  f)最好不用使用模板函数,即使使用也只限定于自己使用51Testing软件测试网"[$zF7s/S-Aq7|

e%XRKw&u5@ `f0  (5)类51Testing软件测试网R%Gw|)UG]sn

5? _-l4BI5T0  a)少用继承,多用组合51Testing软件测试网7_$ZK6_ p QT

qVy'S%h#JB0V"Q0  b)对于构造函数,多用explicit,防止编译器强行转换51Testing软件测试网(O%erE:xP:|:T

2R UZ-P&LHf0  c)对于指针成员变量,务必注意拷贝构造函数和赋值函数的编写

(_8he t9{&H;E8e2kr0

~MB~V%Y$s/Z0  d)对于类指针,为了防止内存泄漏或者资源重复释放,最好自己管理,不要相信智能指针51Testing软件测试网"YSl$V&AHG3}T

51Testing软件测试网o v+FV[1Kd i!^~

  e)继承类中的析构函数要定义为virtual类型51Testing软件测试网b8aa.UHr3YW

51Testing软件测试网H@D6K[ D R

  f)构造函数要简单,复杂的资源分配请在类成员函数init中定义51Testing软件测试网;}@B y]

qqsI4Guy0  g)对于全局类变量,相互定义之间不要存在依赖51Testing软件测试网9[/HgEUi

51Testing软件测试网`D/H'Z1w

  h)严格区分类指针的释放,注意delete和delete[]的区别51Testing软件测试网'A)me%yZe Y|

S(sB&_iC0  i)对于类中锁的问题,可以利用类的构造、析构、引用特性解决

'H_[ P,A#G&~ki051Testing软件测试网!fNz1mNWz

  j)多用class,少用struct51Testing软件测试网I zTj ^8zk

&k6nr*pQ0TrlMz3v0  (6)类的高级特性51Testing软件测试网Q4Of%bhx0H][6v fc

3B^\e T0  a)不要使用算术符重载51Testing软件测试网 [4hHO o ia

51Testing软件测试网LM o5B0Af(A

  b)不要用模板,除非自己用,自己用也要少用51Testing软件测试网*M-m,O4L3m#Nw$e

W@y2}Y||2P0  c)不用使用C++中的typeid属性

]8|a8c-b0o ^~6f051Testing软件测试网3WYjD$dF{

  d)不要用异常

lk w D0DP} mb051Testing软件测试网_ [$m)zeIXQ

  e)不要用virtual继承

fk:c yeV.I`'\0

w~|7}tt6T0Z(_2p ?^0  f)不要用多类继承

7{ L].Ru(Q051Testing软件测试网"F^9p8q"A5f7Y2u

  g)不用要stl,当类中存在指针变量的时候,stl很多时候是搞不定的,而vector、list、find、sort你是搞得定的51Testing软件测试网Y"C"n(xm;?$ie_


TAG:

 

评分:0

我来说两句

Open Toolbar