虽然名字可以嵌套在类内,但全局函数、全局变量以及类的名字还是在同一
全局名字空间中。
可以用C++的名字空间namespace 特征,把一个全局名字空间分成多个可管理
的小空间。
namespace的目的是产生一个新的名字空间
创建一个名字空间与创建一个类非常相似
//: C10:MyLib.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
namespace MyLib {
// Declarations
}
int main() {} ///:~
这就产生了一个新的名字空间,其中包含了各种声明
namespace与class、struct、union和enum的区别
namespace只能在全局范围内定义,但它们之间可以相互嵌套
namespace定义的结尾,右花括号的后面不必跟一个分号
可以按类的语法来定义一个namespace,定义的内容可在多个头文件中延续,
就好像重复定义这个namespace一样
//: C10:Header1.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#ifndef HEADER1_H
#define HEADER1_H
namespace MyLib {
extern int x;
void f();
// ...
}
#endif // HEADER1_H ///:~
//: C10:Header2.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#ifndef HEADER2_H
#define HEADER2_H
#include "Header1.h"
// Add more names to MyLib
namespace MyLib { // NOT a redefinition!
extern int y;
void g();
// ...
}
#endif // HEADER2_H ///:~
//: C10:Continuation.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include "Header2.h"
int main() {} ///:~
无输出
一个namespace的名字可以用另一个名字来作它的别名,这样就不必敲打那些
开发商提供的冗长的名字
//: C10:BobsSuperDuperLibrary.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
namespace BobsSuperDuperLibrary {
class Widget { /* ... */ };
class Poppit { /* ... */ };
// ...
}
// Too much to type! I'll alias it:
namespace Bob = BobsSuperDuperLibrary;
int main() {} ///:~
不能像类那样去创建一个名字空间实例
无输出