若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。
Namespace 名稱衝突的問題稱為global namespace pollution,而Namespaces讓我們可以較為有效地管理這種「全域命名空間的污染問題」。Library的作者可以利用namespaces機制定義自己的namespace,將library內的符號名稱隱蔽於global namespace之外。例如:
Namespace 名稱衝突的問題稱為global namespace pollution,而Namespaces讓我們可以較為有效地管理這種「全域命名空間的污染問題」。Library的作者可以利用namespaces機制定義自己的namespace,將library內的符號名稱隱蔽於global namespace之外。例如:
namesapce nfu_csie_library { class Math { /*…..*/ }; long getStudentNumber() { /*…..*/ }; }
每一個使用者自定的namespace都表現出不同的namespace scope。宣告於namespace內的物體我們稱為namespace成員(members)。
Namespace的定義
namespace namespace_name { /* Member declarations */ /* Member definitions */ }
Namespace的定義區塊並不一定得連續出現。
「同一個namespace可跨越不同的程式本文檔」
「同一個namespace可跨越不同的程式本文檔」
Example:
/* Math.h */ namespace pll_math { double cos(double x) { /*…..*/ }; } /* Math.c */ #include "Math.h" namespace pll_math { double sin(double x) { /* ….. */ }; }
Scope運算子( :: operator)
使用者自定的namespace中的成員,其名稱會被自動冠以namespace名稱做為前導,並加上所謂的scope(::)。另外scope運算子也可以用來表示global namespace的成員
Example:
使用者自定的namespace中的成員,其名稱會被自動冠以namespace名稱做為前導,並加上所謂的scope(::)。另外scope運算子也可以用來表示global namespace的成員
Example:
/* ScopeDemo.cpp */ #include <iostream> using namespace std; namespace pll_math{ const double PI = 3.14159; } const double PI = 3.14; int main(int argc, char **argv) { const double PI = 3.1415; cout << PI << endl; cout << ::PI << endl; cout << pll_math::PI << endl; return 0; }
無具名的Namespaces
/* UnnamedNamespaces.cpp */ #include <iostream> using namespace std; namespace{ int unnamedMember = 13; } int main(int argc, char **argv) { cout << unnamedMember << endl; return 0; }
註:此unnamedMember變數只在UnnamedNamespace.cpp檔內可見,也就是它的scope是在本檔案內。
使用Namespace的成員
有三種方式:Namespace Aliases、Using Declarations、Using Directives
Example:
有三種方式:Namespace Aliases、Using Declarations、Using Directives
Example:
/* UsingNamespace.cpp*/ #include <iostream> using namespace std; namespace pll_math{ const double PI = 3.1415928; const double MAX = 6; } int main(int argc, char **argv) { namespace m = pll_math; // namespace alias cout << m::PI << endl; using pll_math::PI; // using declaration cout << PI << endl; using namespace pll_math; // using directive cout << MAX << endl; return 0; }
註:using directive和using declaration要搭配著使用,以免又發生global namespace pollution。
標準的Namespace std
C++ standard library中的所有組件都被宣告並定義於一個namespace std中。像這樣子:
C++ standard library中的所有組件都被宣告並定義於一個namespace std中。像這樣子:
namespace std { double cos(x); /*……*/ }
只不過它可能會跨越很多個header files及Implementation files。
沒有留言:
張貼留言