跳轉到內容

程式語言導論/名稱空間的作用域

來自華夏公益教科書,開放的書籍,開放的世界

名稱空間是用於限制程式中變數作用域的命名程式區域。它們被用於許多程式語言,為一組變數、函式、類等建立獨立的區域。名稱空間的使用有助於避免與現有定義衝突。名稱空間提供了一種實現資訊隱藏的方式。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 庫。

使用塊的作用域

華夏公益教科書