C++的基本概念和术语 |
声明
说明告诉编译器一个程序元素或名称存在,定义指定名称描述的是什么代码或数据,一个名称必须先说明而后才能使用。一个说明向一个程序中引入一个或多个名称,说明在一个程序可出现不止一次。因此,可以为每个编译单元说明类、结构、枚举类型和其它用户定义类型。说明还可作为定义,除了以下说明:
是说明又是定义的例子有:
//说明和定义整型变量i和j int i;int j=10; //说明枚举suits enum suits {Spades=1,Clubs,Hearts,Diamonds}; //说明类CheckBox class CheckBox:public Control
{ public: Boolean IsChecked(); virtual int ChangeState()=0; }; 定义
一个定义是一个对象或变量、函数、类或枚举的唯一规格。由于定义必须唯一,所以一个程序对于一给定的程序元素只能包含一个定义。说明和定义之间可以是多对一的关系。
C++的名称仅能用于一个程序的特定区域,这个区域被称为名称的"范围"。范围确定一个不表示静态范围的对象的名称的生存期,范围还指出了当类构造和析构函数被调用,以及对范围而言是局部的变量被初始化时一个名称的可见性。
有五种范围: 1 局部范围,在一个块内说明的名称仅在此块中以及包含在此块中的块内是可访问的,且仅从说明后开始。一个函数在函数最外层块范围内的普通参量的名称具有局部范围,就好象它们在包含函数体的块内被声明一样,考虑以下代码段:
{
int i;
} 由于i的声明包含在花括号括起的块内,所以i有局部范围而且在花括号外永远不能被访问,因为在闭花括号前没有代码对其进行访问操作。 2 函数范围,可在一个函数内的任意位置被使用,但在函数外部则不能访问。
3 文件范围,任何在所有块或类的外部说明的名称具有文件范围,在其说明后,在编译单元的任何位置均可访问。带有文件范围的不说明为静态对象的名称通常被称为"全局"文字。
3 类范围,类成员名具有类范围。类成员函数仅能用对象上的成员选择运算符(.或->)或成员指针运算符(.*或->*)或指向那个类的对象的指针进行访问,非静态类成员数据被认为相对于那个类的对象是局部的。 考虑以下类说明: class Point
{ int x ; int y ; }; 类成员x和y被认为是在类Point范围内。 4 原型范围,在函数原型中说明的名称仅到了原型结尾处才是可见的。以下原型说明了两个名称(szDest,szSource);这些名称在原型结尾处便超出范围了:
char *strcpy(char *szDest,const char *szSource);
编译单元 当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp 文件名同名的目标文件(.o或是.obj) 。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。
自由函数 如果一个函数是自由函数,那么这个函数不是类的成员函数,也不是友元函数。
一个程序由连接在一起的一个或多个转换单元组成,从包含main函数的转换单元开始执行。
连接的类型:
在编译单元之间共享对象或函数的名称的方式被称为"连接"。这些名称有: 1 内部连接,即它们仅指自己的编译单元中的程序元素,不与其它编译单元共享。在其它编译单元中的相同的名称可以指不同的对象或不同的类。具有内部连接的名称有时被认为相对于它们的编译单元是局部的。 以下情况是内部连接: a)所有的声明
b) 名字空间(包括全局名字空间) 中的静态自由函数、静态友元函数、静态变量的定义 c) enum 定义 d) inline 函数定义(包括自由函数和非自由函数) e) 类的定义 f) 名字空间中const常量定义 g) union 的定义 2 外部连接,即指程序中的任意一个编译单元中的程序元素,在编译单元的之间共享。在另一个编译单元中的相同名称被认定为指示同一个对象或类(不能连接通过),具有外部连接的名称有时被认为是全局的 。
以下情况是外部连接:
a) 类非inline 函数总有外部连接,包括类成员函数和类静态成员函数。
b) 类静态成员变量总有外部连接。 c) 名字空间(包括全局名字空间) 中非静态自由函数、非静态友元函数及非静态变量。
3 无连接,即指唯一实体,在另一个范围中的同样的名称可能不是相同的对象,例如一个枚举(但注意,你可以用无连接来向一个对象传递一个指针,这使得在其它编译单元中该对象是可访问的。)具有文件范围的名称的连接以下的连接规则适用于具有文件范围的名称(不是typedef及枚举器名称。 以下情况是无连接: a)枚举器名称及typedef名称。 b)函数参量。 c)具有块范围的所有其他名称。 |