类作用域

来源:互联网 发布:淘宝美国代购推荐 编辑:程序博客网 时间:2024/06/08 17:00

每个类都定义了自己的新作用域和唯一的类型。在类的定义体内声明类成员,将成员名引入类的作用域。两个不同的类具有两个的类作用域。


即使两个类具有完全相同的成员列表,它们也是不同的类型。每个类的成员不同于任何其他类(或任何其他作用域)的成员。

例如

class First {

public:

int memi;

double memd;

};

class Second {

public:

int memi;

double memd;

};

First obj1;

Second obj2 = obj1; // error: obj1 and obj2 have different types


使用类的成员

在类作用域之外,成员只能通过对象或指针分别使用成员访问操作符 . 或-> 来访问。这些操作符左边的操作数分别是一个类对象或指向类对象的指针。跟在操作符后面的成员名字必须在相关联的类的作用域中声明。

作用域与成员定义

尽管成员是在类的定义体之外定义的,但成员定义就好像它们是在类的作用域中一样。

形参表和函数体处于类作用域中

在定义于类外部的成员函数中,形参表和成员函数体都出现在成员名之后。这些都是在类作用域中定义,所以可以不用限定而引用其他成员。

函数返回类型不一定在类作用域中

与形参类型相比,返回类型出现在成员名字前面。如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外。如果返回类型使用由类定义的类型,则必须使用完全限定名。

类作用域中的名字查找

迄今为止,在我们所编写的程序中,名字查找(寻找与给定的名字使用相匹配的声明的过程)是相对直接的。
1. 首先,在使用该名字的块中查找名字的声明。只考虑在该项使用之前声明
的名字。
2. 如果找不到该名字,则在包围的作用域中查找。
如果找不到任何声明,则程序出错。在 C++ 程序中,所有名字必须在使用之前声明。

类作用域也许表现得有点不同,但实际上遵循同一规则。可能引起混淆的是函数中名字确定的方式,而该函数是在类定义体内定义的。

类定义实际上是在两个阶段中处理:
1. 首先,编译成员声明;
2. 只有在所有成员出现之后,才编译它们的定义本身。

当然,类作用域中使用的名字并非必须是类成员名。类作用域中的名字查找也会发生在其他作用域中声明的名字。在名字查找期间,如果类作用域中使用的名字不能确定为类成员名,则在包含该类或成员定义的作用域中查找,以便找到该名字的声明。

类成员声明的名字查找

按以下方式确定在类成员的声明中用到的名字。

1. 检查出现在名字使用之前的类成员的声明。

2. 如果第 1 步查找不成功,则检查包含类定义的作用域中出现的声明以及出现在类定义之前的声明。

类成员定义中的名字查找

按以下方式确定在成员函数的函数体中用到的名字。
1. 首先检查成员函数局部作用域中的声明。
2. 如果在成员函数中找不到该名字的声明,则检查对所有类成员的声明。
3. 如果在类中找不到该名字的声明,则检查在此成员函数定义之前的作用域中出现的声明。
0 0
原创粉丝点击