还剩13页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
1.工口rLrl-p程序版式
1.
1.对齐
1.
1.
1.程序块要采用缩进风格编写,缩进的空格数为4个使用VC提供的Tab键对齐〃{〃和〃厂应独占一行并且位于同一列,同时引用他们的语句对齐
1.
1.
3.之的代码块在〃{〃右边数分外左对齐例正确错误空行每一个声明之后,每一个函数定义之后要加空行floatGetValuevoid;//良好的风格floatGetValue;//不良的风格如果参数是指针,且仅作输入用,则应在类型前加const以免指针在函数体被意外修改;普通地,应将目的参数放在前面,源参数放在后面例voidStrngCopychar*strlDestintionconsthar*StrSource如果参数以值传递的方式传递对象,则宜改用const〃方法传递,能提高效率
4.
3.
1.
4.防止函数有太多的参数,参数个数应尽量控制在5个以
4.
3.
1.
5.尽量不要使用类型和数目不确定的参数例intprintfconstcha*format[argument]...;
4.
3.
1.
6.对于置类型参数要传值
4.
3.
1.
7.需要传指针不传引用的情形a部需要用NULL状态引用没有NULL状态b假设参数是被new出来的,是将在函数被释放
4.
3.
2.返回值规则函数的输出值结果用输出参数普通为指针获得,状态用return返回如果返回一个对象,普通用引用传递,但有的情况下必须用值传递例如classString♦••//赋值函数Stringoperate=constStringother;//相加函数,如果没有friend修饰则只许有一个右侧参数friendStringoperate+constStringslconstStrings2;private:char*m_data;}String的赋值函数operate=的实现如下StringString::operate=constStringfeotherifthis二二feother{return*this;deletemdata;m_data=newchar[strlenother.data+l];strcpymdataotherdata;return*this;//返回的是*this的引用,无需拷贝过程对于赋值函数,应当用〃引用传递〃的方式返回String对象如果用〃值传递〃的方式虽然功能仍然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开消,降低了赋值函数的效率例如Stringabc;•••a二b;〃如果用〃值传递〃,将产生一次*this拷贝a二b二c;〃如果用〃值传递〃,将产生两次*this拷贝String的相加函数operate+的实现如下:Stringoperate+constStringslconstStrings2Stringtemp;deletetempdata;//tempdata是仅含‘\0的字符串temp.data二newchar[strlensl.data+strlens
2.data+11;strcpytempdatasi.data;strcattempdatas
2.data;returntemp;对于相加函数,应当用〃值传递〃的方式返回String对象如果改用〃引用传递〃,则函数返回值是一个指向局部对象temp的〃引用〃由于temp在函数完毕时被自动销毁,将导致返回的〃引用〃无效例如c=a+b;此时a+b并不返回期望值,c什么也得不到,流下了隐患尽量保持函数惟独惟一出口函数返回状态,尝试用枚举作类型4325当函数返回引用或者指针时,用文字描述其有效性制止成员函数返回成员的引用或者指针函数部规则在函数体的入口处”,对参数的有效性发展检查,应正确使用断言assert断言assert是仅在Debug版本起作用的宏,它用于检查不应该”发生的情况例void*memcpyvoid*pvToconstvoid*pvFromsize_tsizeassertpvTo!=NULLpvFrom!=NULL;//使用断言byte*pbTo=byte*pvTo;//防止改变pvTo的地址byte*pbFrom=byte*pvFrom;//防止改变pvFrom的地址whilesize--0*pbTo++=*pbFrom++;returnpvTo;ij在函数的“出口处,应对return语句的正确性和效率发展检查4333return语句不可返回指向找存部变量的指针或者引用,因为该存在函数体一兀毕时被自动销毁4334要搞清晰返回的终究是值、指针,还是引用4335如果函数返回值是一个对象,要考虑return语句的效率通用规则函数的功能要单一,不要设计多用途函数函数体规模要小,尽量控制在100行代码以,不包括注释和空格行尽量防止函数带有记忆功能,一样的输入应当产生一样的输出不用static变量例如如下函数,其返回值〔即功能是不可预测的unsignedintinteger_sumunsignedintbaseunsignedintinde*;staticunsignedintsum=0;//注意,是static类型的//假设改为auto类型,则函数即变为可预测forinde*=1;inde*=base;inde*++{sum+=inde*;returnsum;}用于出错处理的返回值一定要清晰引用的规则a引用被创立时同时被初始化b不能有NULL引用,引用必须与合法的存储单元关联c一旦引用被初始化,就不能改变引用的关系d引用的功能主要是传递参数和返回值C++语言中,函数的参数和返回值的传递方式有三种值传递、指针传递和引用传递以下是〃值传递〃的例如程序由于Funcl函数体的*是外部变量n的一份拷贝,改变*的值不会影响n所以n的值仍然是0ovoidFunclint**二*+io;}•••intn=0;Funcln;cout〃n=nendl;//n=0以下是〃指针传递〃的例如程序由于Func2函数体的*是指向外部变量n的指针,改变该指针的容将导致n的值改变,所以n的值成为10voidFunc2int****=**+10;}••♦intn=0;Func2n;cout〃n=«nendl;//n=10以下是〃引用传递〃的例如程序由于Func3函数体的*是外部变量n的引用,*和口是同一个东西,改变*等于改变n所以n的值成为10voidFunc3int**=*+10;intn=0;Func3n;cout〃n=nendl;//n=10比照上述三个例如程序,会发现〃引用传递〃的性质象〃指针传递〃,而书写方式象〃值传递〃实际上〃引用〃可以做的任何事情〃指针〃也都能够做,为什么还要〃引用〃这东西?答案是〃用适当的工具做恰如其分的工作〃指针能够毫无约束地操作存中的如何东西,尽管指针功能强大,但是非常危wei险就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?如果确实只需要借用一下*个对象的〃别名〃,则就用〃引用〃,而不要用〃指针〃,以免发生意外比方说,*人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,则他就获得了不该有的权利
5.存管理存分配方式有三种分配方式1静态存储区分配,存在编译的时候已经分配好,这块存在整个运行期间都存在,例如全局变量,static变量⑵在栈上创立,执行函数时,函数部局部变量都在栈上创立,函数执行完毕时,这些存储变量自动被释放3从堆上分配,亦称动态存分配,程序运行时用malloc或者new申请任意多少的存,程序员自己负责在何时用free或者delete释放存常见的存错误1存分配未成功,却使用了它对于函数参数,用assetp!=NULL检查,如果是malloc或者new来申请存,应用ifp二二NULL或者if!p=二NULL来处理2存分配虽然成功,但是尚未初始化就引用它,存的默认值并不一定为空3存分配成功,也初始化了,但越界了4忘记了释放存,造成存泄漏释放了存却继续使用它
3.规则用malloc或者new申请存后,应即将检查指会值是否为NULL防止使用指针值为NULL的存不要忘记为数组和动脉存赋值,防止将未被初始化的存作为右值使用防止数组或者指针的下标越界动态存的申请与释放必须配对,防止存泄漏用free或者delete释放存之后,立即将指针设置为NULL防止产生〃野指针〃野指针的三种来源A.指针变量被创立时没有初化B.指针被free或者delete后没有被赋NULLC.指针不在有效期用new创立动态数组,必须用delete[]如:objobjects=newobj
[100];delete[]objects;用newdelete代替malloccalloc和freeMFC控件的命名规则CButtonm_btnValueCboBo*m_cmboValue;CDialogCDlgServerstatus;CDateTimeCtrlmdtcValue;CEditm_editValue;CListBo*m_lsbValue;CListCtrlm_lscValue;COleDateTimemdtValue;CProgressCtrlmprgValue;CRichEditCtrlm_reditValue;CScrollBarm_scrValue;CSliderCtrlmslidValue;CStaticm_staValue;CTabCtrlm_tabValue;CTreeCtrlmtreeValue;MFC资源的命名规则
7.
1.Dialog第一级IDD^MAINQUERY第二级IDD_QUERY_MULTI第三级IDD_QUERY_MULTI_CONFIG
7.
2.MenuIDM_FILTER
7.
3.ToolBarIDT_QUERY
7.
4.CursorIDC_ZOOM
7.
5.BitmapIDB_LOGO_CY
7.
6.IconIDILEFT在一个函数体,逻辑上密切相关的语句之间不加空行,其它地方应加空行分隔变量声明和代码之间加空行函数返回语句用空行例voidFunctionl...//空行voidFunction
2...//空行whileconditionstatementl;//空行ifconditionvoidFunctionl...statement2;else//空行statements;}//空行Returnstatement
41.
3.代码行一行代码只做一件事情,如只定义一个变量,或者只写一条语句
3.
2.if、for、do、whilecaseswitch、default等语句自占——彳亍且if、for、do、while等语句的执行语句局部无论多少都要加括号{}例例如风格良好的代码行例如风格不良的代码行
1.关键字之后要留空格constvirtualinlineifwhilefor函数名之后不要留空格,z(〃向后紧跟〃,〃,二〃,〃.〃,〃;〃,〃)〃向前紧跟〃,〃后要留空格,〃〃;之后如果不是一行的完毕,后面要留空格
5.赋值操作符,比拟,算术,逻辑,第二元操作符先后加空格
4.
6.一元操作符!、〜、++、
一、一等先后不加空格像口、〃.〃、->等先后不加空格例:voidFundint*intyintz;//良好的风格voidFundint*intyint^「不良的风格array
[5]=0;//不要写成array
[5]=0;a.Function;//不要写成a.Function;b-Function;//不要写成b-Function;L
5.长行拆分L
5.l.代码行最长度宜控制在70到80个字符以,代码行不宜过长长表达式拆分,应将操作符放在新行之首,拆分出新行要适当缩进,使排版整齐例ifvery_longer_variablel=very_longer_variablel2very_longer_variable3=very_longer_variablel4very_longer_variable5=very_longer_variablel6dosomething;virtualCMatri*CMultiplyMatri*CMatri*leftMatri*CMatri*rightMatri*;forverylonger_initialization;verylongercondition;verylongerupdatedosomethingO;
1.
6.修饰的位置
6.
1.修饰符*和应挨近变量名char*name;int**y类的版式
1.
7.
1.将public写前面,protect在其后,private写后面,以行为中心变量在函数声明之后逻辑相关的函数罗列在一起例classA{public:voidFundvoid;voidFunc2void;〃空行intij;•••protect:voidFunc3void;voidFunc4void;float*y;•••private:voidFunc5void;voidFunc6void;〃空行stringab;(例文件)
2.
1.每一个文件头阐述该文件包含的容.对include的文件要注释每一个函数的头部注明函数名称、函数说明、输入参数和返回值每一个类即头文件注明类的用途函数之中需要注释不易明折的地方算法设计思想独到的用处原则注释和代码一样要及时更新注释不是代码的重复全部使用‘7/〃方式注释注释尽量不要单独占一行注释要简洁、明了边写代码边写注释,MFC自带的代码注释不用修改对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义变量、常量、宏的注释应放在其上方相邻位置或者右方将注释与其上面的代码用空行隔开if...函数名称函数说明输入参数返回值/voidFunctionfloat*floatyfloatz//endofif
3.命名规共性规则不可用汉语拼音,用英文、用词应准确应用大小写混排方式,如AddChild程序中不要浮现仅靠大小写区分的相似的标识符程序中不要浮现标识符彻底一样的简单变量和全局变量变量名应当使用〃名词〃或者〃形容词+名词〃,如floatfValue;floatfOldVlaue;floatfNewValue;函数名应使用动词或者动词+名词,如voidGetValue;用正确的反义词组命名具有互斥定义的变量或者相反动作的函数,如:intnMinValue;intnMa*Value;intnSetValue;intnGetValue;对于借来的代码,不改变其命名命名规则类名和函数名用大写字母开头的单词组合而成,如classNode;classLeafNode;voidSetValue;变量和参数用小写字母开头的单词组合而成,如BOOFbflag;intnDrawMode;floatfHeight;stringstrTitle;charcSource;常量全用大写字母,用下划线分割单词DDD_SAF静态变量前加前缀s_如StaticintsinitValue;如果不得已需要全局变量,全局变量前加前缀g_如intghowManyPeople类的数据成员加前缀m_如voidobjet::SetValueintwidthintheightm_width=width;mheight=height适当使用匈牙利命名法
4.程序规
4.
1.语句对运算符不少的情况下,应该使用括号区分运算的顺序例如word=high8|lowifa|bac优先级运算符结合律if语句布尔变量与零值比拟时,不可将布尔变量直接与TRUE、FALSE或者
1、0发展比拟假设布尔变量名字为flag它与零值比拟的标准if语句如下ifflag//表示flag为真if!flag//表示flag为假其它的用法都属于不良风格,例如ifflag=TRUEifflag==1ifflag二二FALSEifflag=O整型变量与零值比拟时,应当将整型变量用==〃或者!=直接与0比拟假设整型变量的名字为value它与零值比拟的标准if语句如下ifvalue==0ifvalue!=0不可摹仿布尔变量的风格而写成ifvalue//会让人误解value是布尔变量iflvalue浮点变量与零值比拟时,不可将浮点变量用==〃或者!=与任何数字比拟千万要留意,无论是float还是double类型的变量,都有精度限制所以一定要防止将浮点变量用〃二二〃或者〃!二〃与数字比拟,应该设法转化成〃》二〃或者〃〈二〃形式假设浮点变量的名字为*应当将if*=
0.0//隐含错误的比拟转化为if*=-EPSIN0N*=EPSIN0N其中EPSIN0N是允许的误差〔即精度指针变量与零值比拟时,应当将指针变量用==〃或者!=〃与NULL比拟指针变量的零值是〃空〃〔记为NULL尽管NULL的值与0一样,但是两者意义不同假设指针变量的名字为P,它与零值比拟的标准if语句如下ifp-NULL//p与NULL显式比拟,强调p是指针变量ifp!=NULL不要写成ifp=0//容易让人误解p是整型变量ifp!=0或者ifp//容易让人误解p是布尔变量if!p程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序例如ifconditionreturn*;returny;改写为ifconditionreturn*;}elsereturny;或者改写成更加简炼的returncondition〃*:y;循环语句在多生循环中,如果有可能,应将最长的循环放在最层,最短的循环放在最外层以减少CPU跨越循环层的次数例
4.
1.
3.
2.如果循环体存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面例switch语句的case分支如果不要break要注释,同时要加default语句例switch语句的根本格式是switchvariable{casevaluel:...break;casevalue2:...break;default:...break;常量只使用const常量,不使用宏常量自定义需要对外公开的常量放在头文件*.h中,不需要对外公开的常量放在定义文件礼cpp的头部不能在类中初始化const常量,只能通过枚举常量来解决例错误classAconstintSIZE=100;错误intarray[SIZE];正确classA{...enum{SIZE1=100SIZE2=200;//枚举常量intarrayl[SIZE1];intarray2[SIZE2];};函数参数规则参数书写要完整,不能只写类型,不写参数名,如果函数没有参数,用void填充例如voidSetValueintwidthintheight;//良好的风格voidSetValueintint;//不良的风格voidFunctionint*...//programcodevoidFunctionint*{...//programcode}ifcondition...//programcodeelse...//programcodeifcondition{...//programcodeelse{...//programcodeforinitialization;condition;update...//programcodeforinitialization;condition;update{...//programcodeWhilecondition...//programcodewhilecondition{...//programcode如果浮现嵌套的{}则使用缩进对齐,如••••••intwidth;//宽度intheight;//高度intdepth;//深度intwidthheightdepth;//宽度高度深度*=a+b;y=c+d;z=e+f;*=a+b;y=c+d;z=e+f;ifwidthheightdosomethingO;ifwidthheightdosomethingO;forinitialization;condition;updatedosomethingO;//空行other;forinitialization;condition;updatedosomethingO;other;ifyear=2000ifyear=2000ifa=bc=difa=bc=d//良好的风格//不良的风格//良好的风格//不良的风格fori=0;i10;i++//良好的风格fori=0;i10;i++//不良的风格fori=0;I10;i++//过多的空格*二a〈b〃a:b;//良好的风格*=a〈b〃a:b;//不好的风格int**=y;//良好的风格int**=y;//不良的风格从高到低排列[]-.从左至右!〜++—类型sizeof+一*从右至左*/%从左至右+从左至右«»从左至右==从左至右二二i二•从左至右从左至右八从左至右从左至右从左至右II从右至左〃**从右至左+=-=*=/=%=二八二=«=〉二从左至右forrow=0;row100;row++forcol=0;col5;col++sum=sum+a[row][col];forcol=0col5;col++forrow=0;row100;row++sum=sum+a[row][col];jfori=0;iN;i++ifconditionDoSomethingO;elseDoOtherthing;ifcondition{fori=0;iN;i++DoSomethingO;ijelse{fori=0;iN;i++DoOtherthingO;}。