编程语言导论/命名空间的作用域
命名空间是用于限制程序中变量作用域的命名程序区域。它们被用于许多编程语言,为一组变量、函数、类等创建独立的区域。命名空间的使用有助于避免与现有定义冲突。命名空间提供了一种实现信息隐藏的方式。Java 中命名空间的一些示例是类和包。C++ 中命名空间的一些示例是类、命名空间和结构体。下面的源代码演示了在 Java 中使用命名空间。
import calc.math.*;
package geometry;
public class Circle {
private double radius;
public Circle(double r) {
radius = r;
}
public double getRadius() {
return radius;
}
public double getArea() {
return calc.math.pi * radius * radius;
}
}
上面的 Java 代码定义了一个名为 geometry 的命名空间。这个定义提供了一种方法,可以将类 Circle
与其他程序员可能定义的类区分开来。这种区分是通过将定义的命名空间合并到类中实现的。因此,类变为 geometry.Circle
。代码的第一行显示了一个导入语句,这是 Java 共享定义的方式。有趣的是,方法 getArea
使用了从导入的命名空间 calc.math
中导入的 pi
定义。
在 C++
语言中,namespace
关键字用于创建命名空间。include
语句是 C++ 中共享定义的一种方式。下一个示例演示了两个命名空间 (first
和 second
) 的定义及其使用。命名空间可以通过使用作用域解析运算符 (运算符 "::") 来引用其名称。这在语句 cout << first::var << endl;
(第 14 行) 中得到体现。命名空间也可以与 using
关键字一起使用,该关键字使命名空间的所有成员在当前程序中可用,并且成员可以直接使用,而无需引用命名空间。代码第 3 行的语句使 cout
对象在函数 main
中可用,无需使用作用域解析运算符。
#include <iostream>
using namespace std;
namespace first {
int var = 5;
}
namespace second {
double var = 3.1416;
}
int main () {
cout << first::var << endl;
cout << second::var << endl;
return 0;
}
关键字 private
和 public
将在本书的其他部分详细介绍,它们修改了命名空间中定义的可见性。在 C++
程序中,类和结构体之间没有区别,除了默认情况下,结构体的成员是公有的,类的成员是私有的。此外,结构体默认情况下是公开继承的,而类默认情况下是私有继承的。除此之外,在类中可以做的任何事情,您都可以在结构体中做。
语言库是提供可直接使用的函数的定义和实现的集合。它们是扩展编程语言的一种方式。在 C++ 程序中,可以使用 #include
指令包含库。前面的 C++
示例在第 1 行使用此构造来包含 iostream
库。