开发管理之代码编码规范Word格式文档下载.docx
《开发管理之代码编码规范Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《开发管理之代码编码规范Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
、-
++、
等前后不加空格
1.1.8.
像[]、“.”、一>等前后不加空格
1.12
1.121.
从左至右
!
-++--(类型)sizeof
+-*&
从右至左
*/%
+-
<
>
>
<
=>
=
==!
&
A
|
II
:
=+=-=*=/=%=&
=A=
|=<
=>
if语句
布尔变量与零值比较时,不可将布尔变量直接与TRUEFALSE或者1、0进行比较
假设布尔变量名字为flag,它与零值比较的标准if语句如下:
if(flag)
中,不需要对外公开的常量放在定义文件(*cPP)的头部
不能在类中初始化const常量,只能通过枚举常量来解决
错误:
classA
constintSIZE=100;
(intarray[SIZE];
}
正确:
{…
enum{SIZE1=100,SIZE2=200};
//intarray1[SIZE1];
intarray2[SIZE2];
};
错误)
枚举常量
1.2.
函数
参数规则
参数书写要完整,不能只写类型,不写参数名,如果函数没有参数,用
1.2.1.
1.2.1.1.
例如:
voidSetValue(intwidth,intheight);
voidSetValue(int,int);
floatGetValue(void);
floatGetValue();
void填充
1.2.1.2.
1.2.1.3.
1.2.1.4.
1.2.1.5.
1.2.1.6.
//
良好的风格不良的风格良好的风格不良的风格
如果参数是指针,且仅作输入用,则应在类型前加
被意外修改;
一般地,应将目的参数放在前面,源参数放在后面
例:
voidStrngCopy(char*strlDestintion,consthar*StrSource)
如果参数以值传递的方式传递对象,则宜改用“
避免函数有太多的参数,参数个数应尽量控制在
尽量不要使用类型和数目不确定的参数
intprintf(constcha*format[,argument]
对于内置类型参数要传值
const,以免指针在函数体内
const&
”方法传递,能提高效率
5个以内
…);
1.2.2.
1.2.2.1.
a)内部需要用NULL状态(引用没有NULL状态)
b)若参数是被new出来的,是将在函数内被释放
返回值规则
函数的输出值结果用输出参数(一般为指针)获得,状态用
return返回
如果返回一个对象,一般用引用传递,但有的情况下必须用值传递
1.2.2.2.
classString{
//赋值函数
String&
operate=(constString&
other);
//相加函数,如果没有friend修饰则只许有一个右侧参数
friendStringoperate+(constString&
s1,constString&
s2);
private:
char*m_data;
String的赋值函数operate=的实现如下:
String&
String:
operate=(constString&
other){
if(this==&
return*this;
deletem_data;
m_data=newchar[strlen+1];
strcpy(m_data,;
//返回的是*this的引用,无需拷贝过程
式,虽然功能仍然正确,但由于之中,增加了不必要的开销,
Stringa,b,c;
对于赋值函数,应当用“引用传递”的方式返回
return语句要把降低了赋值函数的效率。
String对象。
如果用“值传递”的方*this拷贝到保存返回值的外部存储单元例如:
a=b;
//
a=b=c;
//String的相加函数operate+
如果用
值传递”,将产生一次*this拷贝
值传递”,将产生两次*this拷贝
的实现如下:
Stringoperate+(constString&
s2){
Stringtemp;
delete;
//是仅含‘0'
的字符串=newchar[strlen+strlen+1];
strcpy,;
strcat,;
returntemp;
}
的方式返回String对象。
如果改用“引用传递”,那temp的“引用”。
由于temp在函数结束时被自动销毁,
c什么也得不到,流下了隐患。
对于相加函数,应当用“值传递”么函数返回值是一个指向局部对象将导致返回的“引用”无效。
c=a+b;
此时a+b并不返回期望值,
1.2.2.3.
尽量保持函数只有唯一出口
1.2.2.4.
若函数返回状态,尝试用枚举作类型
1.2.2.5.
当函数返回引用或指针时,用文字描述其有效性
1.2.2.6.
禁止成员函数返回成员的引用或指针
1.2.3.
1.2.3.1.
函数内部规则
在函数体的“入口处”,对参数的有效性进行检查,应正确使用断言(assert),
断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况例:
*memcpy(void*pvTo,constvoid*pvFrom,size_tsize)
void{
//使用断言pvTo的地址pvFrom的地址
//防止改变防止改变
assert((pvTo!
=NULL)&
(pvFrom!
=NULL));
byte*pbTo=(byte*)pvTo;
byte*pbFrom=(byte*)pvFrom;
//while(size-->
0)
*pbTo++=*pbFrom++;
returnpvTo;
1.2.3.2.
在函数的
出口处”,应对return语句的正确性和效率进行检查
1.2.3.3.
return语句不可返回指向“找内存”(内部变量)的指针或引用,因为该内存在函数体结束时被自动销毁
1.2.3.4.
要搞清楚返回的究竟是值、指针,还是引用
1.2.4.
1.2.4.1.
通用规则
函数的功能要单一,不要设计多用途函数
1.2.4.2.
1.2.4.3.
函数体规模要小,尽量控制在100行代码以内,不包括注释和空格行尽量避免函数带有记忆功能,相同的输入应当产生相同的输出(不用static变量)
示例:
如下函数,其返回值(即功能)是不可预测的。
unsignedintinteger_sum(unsignedintbase)
unsignedintindex;
staticunsignedintsum=0;
//注意,是static类型的。
//若改为auto类型,则函数即变为可预测。
for(index=1;
index<
=base;
index++)
sum+=index;
returnsum;
1.2.4.4.
用于出错处理的返回值一定要清楚
1.2.4.5.
a)
b)
c)
d)
引用的规则
引用被创建时同时被初始化
不能有NULL引用,引用必须与合法的存储单元关联一旦引用被初始化,就不能改变引用的关系引用的功能主要是传递参数和返回值
C++语言中,函数的参数和返回值的传递方式有三种:
值传递、指针传递和引用传递。
以下是“值传递”的示例程序。
由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n,所以n的值仍然是0。
voidFunc1(intx)
x=x+10;
intn=0;
Func1(n);
//n=0
cout<
“n=”<
n<
endl;
以下是“指针传递”的示例程序。
由于改变该指针的内容将导致n的值改变,所以
Func2函数体内的x是指向外部变量n的指针,n的值成为10。
voidFunc2(int*x)
(*x)=(*x)+10;
Func2(&
n);
“n=”<
//n=10
以下是“引用传递”的示例程序。
由于
n是同一个东西,改变x等于改变n,所以
voidFunc3(int&
x)
Func3函数体内的x是外部变量n的引用,n的值成为10。
Func3(n);
对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象传递”。
实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西
就象
答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。
一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。
比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。
2.
内存管理
2.1.
内存分配方式
有三种分配方式
(1)
2.2.
常见的内存错误
静态存储区分配,内存在编译的时候已经分配好,这块内存在整个运行期间都存在,例如全局变量,static变量
在栈上创建,执行函数时,函数内部局部变量都在栈上创建,函数执行结束时,这些存储变量自动被释放从堆上分配,亦称动态内存分配,程序运行时用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存
1)