第一章基础第八节程序结构与书写_第1页
第一章基础第八节程序结构与书写_第2页
第一章基础第八节程序结构与书写_第3页
第一章基础第八节程序结构与书写_第4页
第一章基础第八节程序结构与书写_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序结构与书写规范

命名空间与作用域命名空间作用域与作用域操作符代码书写规范掌握命名空间的用法了解作用域及作用域操作符的用法熟练掌握代码书写规范11.8.3命名空间用户声明的命名空间(也称作名字空间)定义以关键字namespace开头,后面是命名空间的名字,该名字在它被定义的域中必须是惟一的,如果在同样的命名空间域中有其他实体与被定义的命名空间同名,就会发生错误。命名空间定义并没有消除全局命名空间污染问题,但是,使用命名空间大大地缓解了这个问题。如下代码,定义了一个为mySpace的命名空间,空间有个变量为spacemySpace{ intage=10;}21.8.3命名空间在命名空间名之后是由花括号{}括起来的声明块,所有可以出现在全局命名空间域中的声明都可以被放在用户声明的名字空间中,类,变量,函数,以及模板,把一个函数声明放在用户声明的命名空间中并不会改变其意义,这样的声明所引入的名字要与命名空间名复合起来,例如:#include<iostream>usingnamespacestd;namespacemySpace{ voidprintNumber(intival)

{ cout<<ival<<endl;

}}voidmain(){ mySpace::printNumber(12); system(“pause”);}31.8.3命名空间命名空间的定义不一定是连续的,如下代码,这2个命名空间所代表定义了一个命名空间mySpace,里面有个函数printNumber和变量age。#include<iostream>usingnamespacestd;namespacemySpace{ voidprintNumber(intival)

{ cout<<ival<<endl;

}}namespacemySpace{ intage=10;}voidmain(){ mySpace::printNumber(12); cout<<mySpace::age<<endl; system(“pause”);}41.8.3命名空间命名空间的内部依然可以再定义另一个命名空间,使用的时候使用作用域操作符::来调用出命名空间内的数据。#include<iostream>usingnamespacestd;namespacemySpace{ voidprintNumber(intival)

{ cout<<ival<<endl;

} namespacenewSpace

{ intage=10;

}}voidmain(){ mySpace::printNumber(12); cout<<mySpace::newSpace::age<<endl; system(“pause”);}51.8.4作用域C++程序中的每个名字都必须指向惟一的一个对象,函数,类型或模板。这并不意味着在一个C++程序中一个名字只能被使用一次,一个名字可以被重新使用以指向不同的实体,只要编译器能够根据上下文区分出该名字的不同含义即可。C++中常用的作用域:局部作用域,全局作用域6局部域是包含在函数定义或者函数块中的程序文本部分,每一个函数都有一个独立的局部域,在函数中的每个复合语句或块也有一个独立的局部域。如以下代码,相同的名字ival因为分别在两个函数的局部域中,所以命名不冲突。#include<iostream>usingnamespacestd;voidfun1(){ intival;}voidfun2(){ intival;}intmain(){ return0;}1.8.4作用域

局部作用域7如以下代码,相同的名字i因为分别在两个复合语句的局部域中,所以命名不冲突。#include<iostream>usingnamespacestd;voidmain(){ for(inti=0;i<10;i++)

{ cout<<i<<endl;

} for(inti=0;i<5;i++)

{ cout<<i<<endl;

} system(“pause”);}1.8.4作用域

局部作用域81.8.4作用域

局部作用域如以下代码,相同的名字iValue因为分别在两个复合语句的局部域中,所以命名不冲突。#include<iostream>usingnamespacestd;voidmain(){

{ intiValue=10; cout<<ival<<endl;

}

{ intiValue=4; cout<<ival<<endl;

} system(“pause”);}91.8.4作用域

全局作用域程序的最外层的命名空间域被称作全局作用域或全局命名空间域。对象,函数,类型以及模板都可以在全局域中定义。全局域内的函数声明将引入全局函数,而在全局域内的变量声明将引入全局对象,全局对象是一个运行时刻实体,它在程序的整个执行过程中都存在,全局对象占据的存储区的生命期,从程序启动开始在程序终止时结束。101.8.4作用域

全局作用域当一个变量在一个程序文件的所有函数定义之外(并且通常在所有函数定义之前)定义时,则该变量具有全局作用域,即该变量在整个程序包括的所有文件中都有效,都是可见的,都是可以访问的。当一个全局变量不是在本程序文件中定义时,若要在本程序文件中使用,则必须在本文件开始进行声明

。extern<类型名><变量名>;11在C++程序中定义的符号常量也同变量一样具有全局、文件和局部这3种作用域。当符号常量定义语句出现在所有函数定义之外,并且在前面带有extern保留字时,则所定义的常量具有全局作用域。若在前面带有static关键字或什么都没有,则所定义的常量具有文件作用域。若符号常量定义语句出现在一个函数体内,则定义的符号常量具有局部作用域。1.8.4作用域

其他作用域121.8.5作用域操作符作用域操作符::

一般使用在命名空间调用自己空间成员,类调用静态成员,调用全局变量时会用到。命名空间成员名由该命名空间名加作用域操作符进行限定修饰。#include<iostream>usingnamespacestd;namespacemySpace{ namespacenewSpace

{ intage=10;

}}voidmain(){ cout<<mySpace::newSpace::age<<endl; system(“pause”);}131.8.5作用域操作符作用域操作符也可以被用来引用全局名字空间的成员,因为全局命名空间没有命名空间名。如下代码:141.8.6代码书写规范在软件开发过程中,代码的命名规范是一项很突出的内容。一套定义完整、结构清晰明了的命名规范将大大提升源代码的可读性和软件的可维护性。据考证,没有一种命名规则可以让所有的程序员都满意,程序设计教科书一般也不会指定命名规则。但是制定一套令开发组成员基本满意的命名规则,并在项目中贯彻实施,也是团队开发一项必不可少的工作。在C++编程中一般使用匈牙利命名规范。匈牙利命名规范最大的特征就是类型前缀。151.8.6代码书写规范匈牙利命名法通常是通过短小的命名前缀来说明这个变量的数据类型和属性的。使用前缀变量属性g_全局变量c_常量m_类成员变量匈牙利命名法由前缀、描述、类型几个部分组成161.8.6代码书写规范使用前缀数据类型cchar或WCHAR或TCHARbyBYTE(无正负号字符)nshortiintx,yint分别用作x坐标和y坐标cx,cyint分别用作x长度和y长度;C代表「计数器」bBOOLwWORD(无正负号短整数)lLONG(长整数)dwDWORD(无正负号长整数)fnfunction(函数)strstring(字符串)sz以字节值0结尾的字符串h句柄p指针pp指针的指针C声明类的时候使用大写的C后面跟描述I接口声明(抽象类)171.8.6代码书写规范使用前缀描述内容Init初始化Tmp临时变量Dst目的对象Src源对象Wnd窗口181.8.6代码书写规范例如最常使用的字符串拷贝函数的参数命名也如此。因此一个好的命名能让其他程序员一目了然,知道参数或者变量的含义。191.8.6代码书写规范专业程序员都可以很容易地阅读和编写与其习惯的格式略有不同的代码。但是应该在每个源文件乃至每个项目中都使用一致的格式,因为同一段代码中要在几种编程风格之间换来换去是很不舒服的。下面将讲解分析常见的比较好的编程规范是什么。201.8.6代码书写规范定义了从未使用过的变量。检查一下,确认是不是真正要引用该变量。(RAII基于栈的对象经常会引起此警告的误报)如果确实不需要,可以通过插入一个变量本身的求值表达式,使编译器不再报警(这种求值不会影响运行时的速度),给变量赋予初始值是最佳做法。#include<iostream>usingnamespacestd;intmain(){ intival; ival; return0;}#include<iostream>usingnamespacestd;intmain(){ intival=0; return0;}常规做法最佳做法211.8.6代码书写规范设计函数时可能遗漏了return语句。有时候编译器会要求每个分支都有return语句,即使控制流可能永远也不会到达函数的结尾(比如:无限循环,throw语句,其他的返回形式等)。#include<iostream>usingnamespacestd;booltestFunction(intival){ if(ival>10)

{ returntrue;

}}intmain(){ testFunction(12); return0;}例如以上代码,返回值语句被写在了复合语句块中,导致函数最后的路径没有返回值。221.8.6代码书写规范因此当函数返回路径较复杂时,要注意每个路径是否都有return。#include<iostream>usingnamespacestd;booltestFunction(intival){ if(ival>10)

{ returntrue;

} returnfalse;}intmain(){ testFunction(12); return0;}231.8.6代码书写规范有符号数/无符号数不匹配。通常没有必要对符号不同的整数进行比较和赋值。应该改变所操作的变量的类型,从而使类型匹配。最坏的情况下,要插入一个显式的强制转换。其实不管怎么样,编译器都将为你插入一个强制转换,同时还会发出警告,因此在使用这些变量之前就先将其进行强制转换。#include<iostream>usingnamespacestd;intmain(){ unsignedintnCount=10; for(inti=0;i<nCount;i++)

{ cout<<i<<endl;

} return0;}241.8.6代码书写规范当函数中有逻辑判断和对象创建的时候要注意,逻辑判断是否影响到该对象的创建,如果该对象只是在逻辑判断中使用的话,创建对象的过程写在判断中能给程序效率上带来优化。#include<iostream>usingnamespacestd;voidprintString(intival){ charstr[100]="helloWorld"; if(ival>10)

{ cout<<str<<endl;

}}intmain(){ printString(21); return0;}251.8.6代码书写规范例如以下代码,将str的创建放到了判断中,当判断不符合条件的时候,就不会创建str对象,节省了时间。#include<iostream>usingnamespacestd;voidprintString(intival){ if(ival>10)

{ charstr[100]="helloWorld"; cout<<str<<endl;

}}intmain(){ printString(21); return0;}261.8.6代码书写规范软件工程项目里,在源代码中的注释部分也逐渐有了规范,好的规范能让其他程序员更快的了解到这个代码是怎么用的。常见的注释规范一般为以下三种:源文件头部注释。函数头部注释。数据结构声明的注释(包括数组、结构、类、枚举等)。全局变量的注释。对代码的注释。271.8.6代码书写规范源文件头部注释,一般要列出:版权、作者、编写日期和描述。例如以下的源文件的头描述:/*************************************************Copyright:GamfeAuthor:Date:2012-02-24Description:描述主要实现的功能**************************************************/281.8.6代码书写规范函数头部注释,一般列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。例如以下的函数的注释描述:/*************************************************Function://函数名称Description://函数功能、性能等的描述Calls://被本函数调用的函数清单Input://输入参数说明,包括每个参数的作Output://对输出参数的说明。Return:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论