好文档 - 专业文书写作范文服务资料分享网站

C++程序设计 lectureNote11

天下 分享 时间: 加入收藏 我要投稿 点赞

更多关于类\t\r ?

我们已经学习完C++中大部分的重点。在过去的学习的过程中,我们为了讲述的系统性,把一些内容留到这一章来介绍。\t\r ?

这一章的内容比较零碎,包括:名字空间,类的静态成员,把类的声明和实现分开,使用预处理防止重定义错误,内联函数,友员函数和友员类。\t\r ?

1. 名字空间\t\r ?

当一个程序比较大或则多人同时开发一个程序的时候,我们经常会碰到命名冲突:多个变量或则函数的名字相同。C++中有解决这个问题的方法:把程序分割为多个互相不影响的名字空间。在不同的名字空间里可以有相同的标示符(变量、函数、对象的名字)。看下面的程序。\t\r ?

第7--‐20行的程序中包含一个全局变量、一个函数、和一个类。它们被一个名为space1的名字空间包围。我们可以看到,在同一个名字空间里面的标示符是相互可见的,如在函数print中可以访问全局变量data。\t\r ?

那么,名字空间space1外的main函数能访问名字空间中的标示符,如类People,吗?答案是否定的。整个程序都处

于一个名字空间里面:一个匿名的名字空间。而且嵌套的名字空间之间没有谁包含谁关系:匿名的名字空间中的标示符与space1中的标示符互不可见。也就是说,函数main与类

People

是处于不同的名字空间中,它们互不可见。\t\r ?

1 #include 2 using namespace std; 3

4 namespace space1 5 { 6

7 int data = 10; 8

9 void print() {

10 cout << \ << data << endl; 11 } 12

13 class People 14 {

15 public:

16 void greet() {

17 cout << \ << endl; 18 } 19 20 }; 21 22 } 23

24 int main() {

25 using namespace space1; 26 People me; 27 me.greet(); 28 }

要访问另一个名字空间中的标示符,我们可以使用语句

using namespace,如第

2行与第25行所示。在第2行中有我

们非常熟悉的std名字空间,我们学过的很多C++的标准类都

是定义在这个名字空间里面。与#include不同,语句

using namespace

是可以出现在任何地方的,包括函数里面。

语句using namespace是具有范围的。第2行的

using namespace std

的有效范围是第二行到整个文件的末位;

而第25行的using namespace space1的有效范围仅为main函数的内部。再看下面的程序。\t\r ?

1 namespace space1 2 {

3 class People 4 {

5 public:

6 void greet() {

7 cout << \ << endl; 8 } 9 }; 10 } 11

12 class People 13 {

14 public:

15 void greet() {

16 cout << \ << endl; 17 } 18 }; 19

20 int main() {

21 space1::People me; 22 me.greet(); 23 }

在12--‐18行中我们定义了另一个People类。由于与上面的People类不属于同一个名字空间,所以不会有重定义的错误。那么,如果我们要在main函数使用另一个名字空间space1中的People类,应该怎样访问呢?如果我们使用语句

using namespace space1,那当我们使用标示符People时,会

看到编译器给出以下的错误:reference\t\r ?to\t\r ?'People'\t\r ?is\t\r ?ambiguous。原因是using namespace space1后,main函数既可以看到space1中People的,也可以看到匿名的名字空间中的People。解决方法是通过“全名” space1::People来使用

People

类。再看下面的例子。\t\r ?

1 namespace space1

2 {

3 class People 4 {

5 public:

6 void greet() {

7 cout << \ << endl; 8 } 9 }; 10

11 namespace space2 12 {

13 class People 14 {

15 public:

16 void greet() {

17 cout << \ << endl; 18 } 19 }; 20 } 21 } 22

23 int main() {

24 using namespace space1::space2; 25 People().greet();

26 space1::space2::People().greet(); 27 }

在一个名字空间里面可以定义另一个名字空间,如space1里面的 space2。要访问中space2的People,我们需要使用它

的名字空间的路径:space1::space2,如24行所示。注意,只使用外层的名字空间(space1),是不能使用内层名字空间(space1::space2)中的标示符的。另外一种访问

space1::space2

中的People的方法是给出这个类在名字空间

中的完整路径,如26行所示。再看下面的例子。\t\r ?

1 namespace space1

2 {

3 class People {}; 4 } 5

6 namespace space2 7 {

8 class People {}; 9 } 10

11 namespace space1 12 {

13 class Genius : public People {}; 14 } 15

16 using namespace space1; 17

18 int main() { 19 Genius you; 20 }

同一个名字空间是可以在不同地方定义的。如我们非常熟悉的std就在不同的文件中都有定义,如iostream、vector、

string

等。\t\r ?

2. 静态成员\t\r ?

类有时也可以作为名字空间:对于类的静态成员,类就好

C++程序设计 lectureNote11

更多关于类\t\r?我们已经学习完C++中大部分的重点。在过去的学习的过程中,我们为了讲述的系统性,把一些内容留到这一章来介绍。\t\r?这一章的内容比较零碎,包括:名字空间,类的静态成员,把类的声明和实现分开,使用预处理防止重定义错误,内联函数,友员函数和友员类。\t\r?1.名字空间\t\r?当一个程序比较大或则多人同时开
推荐度:
点击下载文档文档为doc格式
9g6nz3vs2z3uh255c6he20sz532alg00ce4
领取福利

微信扫码领取福利

微信扫码分享