程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++定名空間實例解析

C++定名空間實例解析

編輯:關於C++

C++定名空間實例解析。本站提示廣大學習愛好者:(C++定名空間實例解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++定名空間實例解析正文


定名空間是C++異常主要的概念,本文就以實例情勢對其停止深刻剖析,詳細內容以下:

平日來講,在C++中,定名空間(namespace)的目標是為了避免名字抵觸。每一個定名空間是一個感化域,在一切定名空間以外,還存在一個全局定名空間(global namespace),全局定名空間以隱式的方法聲明,它並沒著名字。在定名空間機制中,本來的全局變量,就是位於全局定名空間中(可以用::member的情勢表現)。

1、界說定名空間

1、每一個定名空間都是一個感化域

和其他感化域相似,在定名空間中的每一個名字必需表現獨一實體,而在分歧定名空間中,可以有雷同名字的成員。

2、定名空間可所以不持續的

定名空間可以界說在幾個分歧的部門:

namespace nsp { 
  /* …… */ 
}  // 定名空間感化域前面不必分號

假如之前沒著名為nsp的定名空間界說,則上述代碼創立一個新的定名空間;不然,上述代碼翻開曾經存在的定名空間添加一些新的成員。

3、定名空間是可以嵌套的

嵌套的定名空間是指界說在其他定名空間中的定名空間。嵌套的定名空間是一個嵌套的感化域,內層定名空間聲明的名字將隱蔽外層定名空間聲明的同名成員:

int x = 20; 
namespace outer { 
  int x = 10; 
  namespace inner { 
    int z = x; 
  } 
} 
 
int main() 
{ 
  std::cout << outer::inner::z; // 輸入10 
  return 0; 
} 

留意,平日我們不把#include頭文件放在定名空間外部。

4、未定名的定名空間

未定名的定名空間(unnamed namespace)是指症結字namespace後緊跟花括號括起來的一系列聲明語句。未定名的定名空間中界說的變量具有靜態性命周期:它們在第一次應用前創立,而且直到法式停止才燒毀。在尺度C++引入定名空間的概念之前,法式須要將名字聲明成static以使其關於全部文件有用,然則,如今在文件中停止靜態聲明的做法曾經被C++尺度撤消了,取而代之的是應用未定名的定名空間。

一個未定名的定名空間可以在某個給定的文件內不持續,然則不克不及逾越多個文件。也就是說,未定名的定名空間僅在特定的文件外部有用,其感化規模不會橫跨多個分歧的文件。別的,因為未定名的定名空間它沒著名字,所以個中界說的名字的感化域與該定名空間地點的感化域雷同:

int i;  // i的全局聲明 
namespace { 
  int i; 
} 
i = 10; // 毛病,二義性 

namespace local { 
  namespace { 
    int i; 
  } 
} 
local::i = 42; // 准確 

2、應用定名空間

對定名空間中成員的援用,須要應用定名空間的感化域運算符(::)。然則,像namespace_name::member_name如許應用定名空間的成員異常煩瑣,我們須要應用一些其他的更輕便的辦法。

1、定名空間的別號

有些定名空間的名字很長或許定名空間嵌套了許多層,我們可認為其設定一個較短的同義詞,也就是別號:

namespace cln = cpluslus_learning_namespace; 
namespace Qlib = outer::inner::QueryLib; 

2、using聲明

一條using聲明(using declaration)語句一次只引入定名空間的一個成員:

using 定名空間名::[定名空間名::……]成員名;  // 例如 using OLib::List; 

3、using指導

using指導(using directive)和using聲明分歧的處所是,我們沒法掌握哪些名字是可見的,由於using指導會使得某個特定的定名空間中一切的名字都可見:

using namespace std;  // 引入定名空間std 

應用定名空間重要是為了避免名字抵觸,假如隨便應用using指導注入定名空間的一切名字,將從新引入名字抵觸的成績。別的,using聲明和using指導在感化域上有差別:using聲明是將一個成員引入以後定名空間感化域內;using指導是將一切成員引入以後和上一層定名空間感化域內:

namespace nsp {  // 定名空間 
  int i=16, j=15; 
} 
 
int j = 0;  // 全局變量 
 
int main() 
{ 
  using namespace nsp;  // 假如應用j,將在::j和nsp::j之間發生抵觸 
  std::cout << j; 
  return 0; 
}

假如將using namespace nsp;改成using聲明using nsp::j;則會准確輸入15。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved