跳转到内容

编程语言导论/命名空间的作用域

来自维基教科书,开放的书籍,开放的世界

命名空间是用于限制程序中变量作用域的命名程序区域。它们被用于许多编程语言,为一组变量、函数、类等创建独立的区域。命名空间的使用有助于避免与现有定义冲突。命名空间提供了一种实现信息隐藏的方式。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++ 中共享定义的一种方式。下一个示例演示了两个命名空间 (firstsecond) 的定义及其使用。命名空间可以通过使用作用域解析运算符 (运算符 "::") 来引用其名称。这在语句 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;
}

关键字 privatepublic 将在本书的其他部分详细介绍,它们修改了命名空间中定义的可见性。在 C++ 程序中,类和结构体之间没有区别,除了默认情况下,结构体的成员是公有的,类的成员是私有的。此外,结构体默认情况下是公开继承的,而类默认情况下是私有继承的。除此之外,在类中可以做的任何事情,您都可以在结构体中做。

语言库是提供可直接使用的函数的定义和实现的集合。它们是扩展编程语言的一种方式。在 C++ 程序中,可以使用 #include 指令包含库。前面的 C++ 示例在第 1 行使用此构造来包含 iostream 库。

使用块的作用域

华夏公益教科书