在C++中支持三种域:局部域、名字空间域和类域。
1.名字空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字:
namespace ns1{ float a,b,c; fun1(){……} … }花括号括起来的部分称声明块。声明块中可以包括:类、变量(带有初始化)、函数(带有定义)等。在域外使用域内的成员时,需加上名字空间名作为前缀,后面加上域操作符“::” 。这里添加了名字空间名称的成员名被称为限定修饰名(qualified name)。如:ns1::a,ns1::fun1()等等。 最外层的名字空间域称为全局名字空间域(global namespace scope),即文件域。
2.名字空间域可分层嵌套,同样有分层屏蔽作用。例如:
namespace cplusplus_PRimer{ namespace Matrixlib{ //名字空间嵌套 class matrix{……} //名字空间类成员matrix …... } }访问matrix,可写:cplusplus_primer::Matrixlib::matrix 。 使用using声明可只写一次限定修饰名。using声明以关键字using开头,后面是被限定修饰的(qualified)名字空间成员名:
using cplusplus_primer::Matrixlib::matrix;//名字空间类成员matrix的using声明以后在程序中使用matrix时,就可以直接使用成员名,而不必使用限定修饰名。
3.使用using指示符可以一次性地使名字空间中所有成员都可以直接被使用,比using声明方便。using指示符以关键字using开头,后面是关键字namespace,然后是名字空间名。 标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在采用标准C++的平台上使用标准C++库中的组件,只要写一个using指示符: using namespace std; 就可以直接使用标准C++库中的所有成员。这是很方便的。 名字空间可以不连续,分为多段,但它们仍是同一个名字空间。名字空间域不能定义在函数声明、函数定义或类定义的内部。
4.名字空间域的引入,主要是为了解决全局名字空间污染(global namespace pollution)问题,即防止程序中的全局实体名与C++各种库中声明的全局实体名冲突。
1.类体也定义了一个域称为类域。在类域中说明的标识符仅在该类的类域内有效。必须加上“类名::”作限定修饰。 2.类的实体——对象中的公有成员也可以在对象之外访问,但必须使用成员访问操作符“.”,对象名+“.”+成员名。 3.定义类本身的目的就是要实现一个封装性,对外是封闭的,对内是开放的,在程序中并不总是需要用成员访问符之类来引用类成员。多数程序代码本身就在类域中,这些程序可以直接访问类成员。 4.####在类域中类成员在类体中被声明的顺序同样很重要,后声明的成员不能被先声明的成员引用。
第一步查找在声明中用到的名字,包括数据成员和函数成员声明中用到的参数类型,第二步才是函数成员体内的名字。例如:
class string{ //字符串类public: typedef int index_type;//为易读易懂用下标型命名 char GetstringElement(index_type elem) { return Astring[elem]; } // Astring未说明private: char Astring[30]; //Astring后说明};表面上看是错的;实际上是对的。因为Astring名字的解析是在第一步,而内联函数使用它是在第二步。
这一篇主要阐述一下名字空间域,类域,作用域限定符等问题,为后续开展阅读源码的工作做准备,马上将会讲述C++标准库中的数据结构
新闻热点
疑难解答