Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1477307
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: C/C++

2012-05-31 16:09:26



编写C++/C代码规则
参考书目《高质量C++/C编程》(林锐著)
能长期稳定地编写出高质量程序的程序员称为编程老手。
能长期稳定地编写高难度高质量程序的程序员称为编程高手。
※知错就改;温故知新;坚持学习,天天向上
规则
★为了防止头文件重复引用,应当用ifndef/define/endif结构产生预处理块。
★用include表示引用标准库的头文件;用include "filename.h"引用非标准库的头文件。
?★头文件只存放“声明”而不存放“定义”;不提倡使用全局变量,不要在头文件声明,分目录放置;如果头文件是私有的,为加强其隐蔽性,存放在子目录中。

★类声明之后,每个函数定义之后都要加空行。
★逻辑密切相关的不加空行,其他的地方应加空行。
★一行代码只做一件事。
★if,for,while,do等语句各自占一行,执行语句不得紧跟其后。无论执行语句有多少都要加{}。
★变量定义时初始化。
★关键字之后要留空格,函数名之后不留空格。
★“{”和“}”独占一行与引用它们的语句左对齐。
★“{}”内语句在右边数格处左对齐。
★代码行(hang)为一屏幕能显示下的长度。
★长代码表达式在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当缩进,使排版整齐语句可读。
×将修饰符*和&紧靠变量(不同意!既然都不允许int* x,y的声明方式,为何不靠近数据类型!)
★注释是代码提示,不是文档(象我,在没有条件写文档的情况下只能拿注释当文档!)注释与代码一直,没用的注释及时删除。注释放在代码上方!
★★尽量使结构清晰,避免繁琐的注释。
★★多重嵌套结束处加注释,便于阅读。
★★标识符应当直观可拼读,长度应符合“min-length&&max-informatrion”原则。
★★与所采用的OS或开发工具的风格保持一致。
★不要靠大小写区分相似的标识符。
★★不要出现完全相同的局部变量和全局变量。
★变量名使用“形容词+名词”。
★★全局函数名使用“动词”+“名词”;类成员函数名只使用“动词”。
★★用正确的反义词表互斥的变量或相反的动作函数。
★windows程序开发“匈牙利”命名规则
类名和函数名首字母大写
变量和参数用小写字母开头的单词组合而成
常量全部大小用下划线分割单词
静态变量s_,全部变量g_,类的类数据成员m_。
★★对于unsigned的变量加入un前缀,对于常用的,并且通过变量名称如:(size len 等)容易推断出的变量不加前缀
★代码行中符号较多,用括号确定其优先级。
★复合表达式不要太复杂,不要多用途,不要与数学表达式混淆。
★不可将布尔变量与TRUE,FALSE或者1,0进行比较。
★将整形变量用“==”或“!=”直接与0比较。
★不可将浮点变量用“==”或“!=”与任何数字比较。
★指针变量用“==”或者“!=”与NULL比较。
★if的条件可写成if(NULL == p),注意。
★★只有==使用变量在右的方式,!=、 >、 >=、 <、 <=条件不使用变量在右的方式
★注意使用其简单模式:condition?x:y。
★★长循环在最内,会提高循环效率。
★逻辑判断套循环效率高,但不易理解,不易修改。
★★不可在循环体内改变循环变量。
★for循环采用半开半闭区间写法for(i=0;i ★每个case语句后都要加break。
★不要忘记default分支。
★多重嵌套可使用goto跳出。
★★函数很多返回,且返回之前要释放堆上申请的内存或关闭文件等操作,可使用goto返回位置。
★★使用含义直观的常量表示程序中多次出现的数字或字符串。
×在C++中只使用const不使用#define。
★需要对外公开的常量放在头文件中,不需要公开的放在定义文件的头部;用户看得见的放在一个公共的头文件中,便于管理。
★★定义中应表现出关系密切的常量间的关系。
★类中常量应用enum{SIZE1=100, SIZE2=200}。
★参数的书写要完整(类型 名字);无参数应写void(声明中用void)。
★★参数要命名恰当,顺序合理。
★如果参数是指针,且反作输入用,应在类型前加const,以防在函数内被修改。
★值传递,传递对象时应用const& 方式省去临时对象的构造和析构过程,提高效率。
★★参数最好控制在五个以内,尽量不使用类型和数目不确定的参数。
★不要省略返回值类型。
★★函数名和返回值在语义上不可冲突。
★返回对象时使用“引用传递”可提高效率,但有些场合会出错。
★★在函数体的“入口处”对参数的有效性进行检查—正确使用断言(assert)。在函数体的“出口处”对return语句的正确性和效率进行检查。不能 返回指针“栈内存”的“指针”或引用 返回的是“值”,“指针”还是“引用”。返回值是个对象,要考虑return的效率。
★★函数应功能单一,50行代码以内,避免“记忆”(static)功能,检查全局变量,文件句柄等,出错处理的返回值一定要清楚。
★★assert不仅说明非法错误还要说明非法错误的原因!
★★对参数合法性的判断:assert()只适用自己和团队内部调用的函数,是一种“约定”的检查,对外提供的函数接口不应使用assert(),应用if替代。

内存分配方式:静态存储区域,在栈上创建,从堆上分配。
内存错误以及对策:内存未分配成功却使用它,使用之前检查指针是否为NULL
分配成功却未初始化却使用了;赋初值
忘记释放内存,new/delete malloc/free成对出现
释放了却还使用:数据结构不合理,重新设计;return用错;野指针
修改指向静态存储区的指针中的内容将出错
数组用库函数strcpy(),strcmp()进行复制和比较
指针内容比较,先申请len+1个空间内存在用strcpy比较 sizeof(数组)计算数组的容量sizeof(指针)计算指针变量的容量 数组作为函数的参数进行传递时,数组自动退化为同类型指针,不要用指针参数申请动态内存,如果必须应用指向指针的指针 指针与其所指向的内存的消亡是没有联系的
new/delete对对象比malloc/free多调用构造和析构函数
内存耗尽指针将返回NULL;用return返回;用exit(1)终止程序
异常处理如 vc++中_set_new_hander函数?
malloc的使用:int* p = (int *)malloc(sizeof(int) * length);
free的使用free(NULL)没有问题,free(p)且p!=NULL二次将出错
new数组对象时,delete[]数组释放
重载 小心隐式类型转换
重载,隐藏,覆盖
参数缺省值只出现在函数声明中,多个缺省值从后向前挨个缺省
重载运算符
×内联取代宏代码,内联放定义处;代码长,有循环不易inline。inline会对栈溢出的排错造成困难
一定要写无参数构造函数,拷贝构造函数,析构函数,赋值函数,偷懒时候可将其声明为private
若逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能
阅读(1699) | 评论(0) | 转发(0) |
0

上一篇:C++虚函数表解析

下一篇:进程环境

给主人留下些什么吧!~~