C++中的namespace ----轉載

轉自:http://blog.csdn.net/yao_zhuang/article/details/1853625

?

namespace中文意思是命名空間或者叫名字空間,傳統的C++只有一個全局的namespace,但是由于現在的程序的規模越來越大,程序的分工越來越細,全局作用域變得越來越擁擠,每個人都可能使用相同的名字來實現不同的庫,于是程序員在合并程序的時候就會可能出現名字的沖突。namespace引入了復雜性,解決了這個問題。namespace允許像類,對象,函數聚集在一個名字下。本質上講namespace是對全局作用域的細分。

我想大家都見過這樣的程序吧:
hello_world.c
#include <iostream>
using namespace std;

int main()
{
??? printf("hello world !");
??? return 0;
}
我想很多人對namespace的了解也就這么多了
但是namespace遠不止如此,讓我們再多了解一下namespace

namespace的格式基本格式是
namespace identifier
{
??? entities;
}
舉個例子,
namespace exp
{
??? int a,b;
}
有點類似于類,但完全是兩種不同的類型。
為了在namespace外使用namespace內的變量我們使用::操作符,如下
exp::a
exp::b
使用namespace可以有效的避免重定義的問題
#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;
}
結果是
5
3.1416
兩個全局變量都是名字都是var,但是他們不在同一個namespace中所以沒有沖突。

關鍵字using可以幫助從namespace中引入名字到當前的聲明區域
#include <iostream>
using namespace std;

namespace first
{
? int x = 5;
? int y = 10;
}

namespace second
{
? double x = 3.1416;
? double y = 2.7183;
}

int main () {
? using first::x;
? using second::y;
? cout << x << endl;
? cout << y << endl;
? cout << first::y << endl;
? cout << second::x << endl;
? return 0;
}
輸出是
5
2.7183
10
3.1416
就如我們所指定的第一個x是first::x,y是second.y

using也可以導入整個的namespace
#include <iostream>
using namespace std;

namespace first
{
? int x = 5;
? int y = 10;
}

namespace second
{
? double x = 3.1416;
? double y = 2.7183;
}

int main () {
? using namespace first;
? cout << x << endl;
? cout << y << endl;
? cout << second::x << endl;
? cout << second::y << endl;
? return 0;
}
輸出是
5
10
3.1416
2.7183
正如我們所預見的導入的整個的first的namespace,前一對x,y的值就是first中的x,y的值。
這里我們不能在“using namespace first;“下加一句“using namespace second;“,為什么呢?
這樣做無異于直接完全的忽視namespace first和namespace second,會出現重復定義的結果,所以前面的hello_world.c中的using指令的使用一定程度上存在問題的,只是因為我們就用了一個namspace,一旦引入了新的namespace這種做法很可能會出現重復定義的問題。

在頭文件中,我們通常堅持使用顯式的限定,并且僅將using指令局限在很小的作用域中,這樣他們的效用就會受到限制并且易于使用。類似的例子有
#include <iostream>
using namespace std;

namespace first
{
? int x = 5;
}

namespace second
{
? double x = 3.1416;
}

int main () {
? {
??? using namespace first;
??? cout << x << endl;
? }
? {
??? using namespace second;
??? cout << x << endl;
? }
? return 0;
}
輸出是
5
3.1416
可以看到兩個不同的namespace都被限制在了不同作用域中了,他們之間就沒有沖突。

namespace也支持嵌套
#include <iostream>

namespace first
{
??? int a=10;
??? int b=20;

??? namespace second
??? {??
??????? double a=1.02;
??????? double b=5.002;
??????? void hello();
??? }??

??? void second::hello()
??? {??
??? std::cout <<"hello world"<<std::endl;
??? }
}

int main()
{
??? using namespace first;

??? std::cout<<second::a<<std::endl;
??? second::hello();
}
輸出是
1.02
hello world
在namespace first中嵌套了namespace second,seond并不能直接使用,需要first來間接的使用。

namespace可以使用別名,在對一些名字比較長的namespace使用別名的話,是一件很愜意的事。但是與using相同,最好避免在頭文件使用namespace的別名(f比first更容易產生沖突)。
namespace f = first;

最后,namespace提供了單獨的作用域,它類似于靜態全局聲明的使用,可以使用未命名的namespace定義來實現:
namespace { int count = 0;}???????? //這里的count是唯一的
??????????????????????????????????????????????? //在程序的其它部分中count是有效的
void chg_cnt (int i) { count = i; }

參考資料:
《C++必知必會》 [美]Stephen C.Dewhurst 著,榮耀譯?? 條款23名字空間
http://www.cplusplus.com/doc/tutorial/namespaces.html
《C++精粹》???? [美]Ira Pohl 著 王樹武 陳朔鷹 等譯 P15

轉載于:https://www.cnblogs.com/hyghb/p/8486625.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281144.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用訪問控制策略訪問服務網格內的服務

當在實施服務網格時&#xff0c;不可避免的存在網格外服務訪問網格內服務的情況&#xff0c;也就是服務網格的平滑落地。這種中間狀態可能會持續較長的時間&#xff0c;也是我們在落地的時候需要解決的問題之一。又或者&#xff0c;有的應用處于某些考慮并不適合使用服務網格&a…

Scrapy從理論到爬圖

Scrapy系列教程&#xff1a; https://www.daxueyiwu.com/post/71 scrapy爬蟲啟示錄-小伙子老夫看你血氣方剛這本《爬蟲秘錄》就傳給你了 0 點贊 ? 0 回復 ? 5月前 Scrapy初章-Scrapy理論簡介 0 點贊 ? 0 回復 ? 5月前 Scrapy次章-啥也不干就是爬圖 0 點贊 ? 0 回復 ? 5月…

gfi截圖_GFI Backup Home Edition是Windows的免費數據備份實用程序

gfi截圖In today’s tough economic times the last thing you want is to lose important data because you couldn’t afford a quality backup utility. Today we look at GFI Backup Home Edition, a completely free professional grade backup solution. 在當今艱難的經…

需求工程閱讀筆記03

需求工程與運營商技術管理人員的結合點思考&#xff1b; 運營商的技術管理人員有時會發現自己處于比較尷尬的一個境地&#xff0c;因為一方面自己并不直接開發、實現各種系統&#xff0c;而都是采用外包的方式&#xff0c;業務的需求都是經由自己再轉給外包方&#xff0c;感覺自…

使用BeetleX.MQTT構建服務

已經有很長一段時間沒有寫代碼&#xff0c;為了不讓自己的代碼技能有所下降所以針對BeetleX擴展了一個MQTT協議來保持自己的代碼設計和編寫能力。接下來簡單介紹一下如何使用BeetleX.MQTT來構建對應的TCP或WebSocket服務。 以下實現是針對MQTT 3.1.1版本&#xff0c;協議的實…

vlc 視頻流跳數_如何解決在播放高清晰度視頻文件的VLC中跳過和滯后的問題

vlc 視頻流跳數VLC is the king of all media… it plays almost anything on any platform, any time, any place. It’s great. Lately, however, I’ve been having issues with VLC skipping whenever I’m playing high-def media streaming over a network. VLC是所有媒體…

求助:關于sql如何統計時間的問題

三、現在我們假設應用計時分為app應用和web應用&#xff0c;需要考慮如下幾個方面&#xff1a; &#xff08;1&#xff09;多時間段&#xff08;2&#xff09;表中有冗雜數據 &#xff08;3&#xff09;用戶是在web端和app端都登陸&#xff0c;這種類型的重復時間段只能取其一 …

onlyoffice中文字體下載

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/778 下劃線開頭的是頁面顯示中文的字體&#xff0c;不帶下劃線的是頁面顯示英文的字體 calibri.ttf -CalibriTimes New Roman.ttf _FANGSONG.otf -仿宋FANGSONG.otf_FS_GB2312.otf -仿宋_GB2312_HWZS.otf -華文…

onlyoffice 20并發限制處理

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/31 開源版本連續打開20個頁面就會彈出該提示。 一.方案一 修改六個app.js文件 find ./ -name app.js 目錄下所有app.js文件&#xff0c;對代碼行進行修改&#xff0c;只是經過簡單的測試&#xff0c;希望發現…

[Linux環境]-centos7下安裝jdk1.8.0_141流程.

1.查看當前虛擬機java環境版本: java -version [rootcentos-linux-7 bin]# java -version java version "1.7.0_111" OpenJDK Runtime Environment (rhel-2.6.7.2.el7_2-x86_64 u111-b01) OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode) 2.查看當前安裝版…

石橋圖里的一個故事

唐朝詭事錄有一個石橋圖章節&#xff0c;里面記載了一個故事。十年前&#xff0c;南州鄉賢謝員外的兩個兒子&#xff0c;要求謝家的老仆人帶自己去湖里游玩。哪知游玩到湖中間&#xff0c;突然下起了瓢潑大雨&#xff0c;員外家的一個兒子被驚嚇掉落水里。老仆人的兒子趕忙去救…

onlyoffice更新中文字體總結

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/760 1. 通過字體修改軟件FontCreator修改字體名稱 &#xff08;1&#xff09;下載fontcreat.exe &#xff08;2&#xff09;將Windows/fonts 下的字體文件拷貝至 我的文檔/fonts (3) 使用fontcreat打開字體…

ubuntu 鍵盤快捷鍵_如何使用鍵盤快捷鍵在Ubuntu中提高生產力

ubuntu 鍵盤快捷鍵diceareawesome1/Shutterstock.comdiceareawesome1 / Shutterstock.comWe’re always looking for new ways to speed up everyday tasks in Ubuntu. We’ll show you some keyboard shortcuts you might not have known about, and show you how to make you…

核心編程之十一章的11-9

def add(x,y): a x y def average(): list1 [] list1.append(a/2) print(list1) return a #為什么return a 放在這里呢&#xff0c;因為如果放在外面的話&#xff0c;根據return的屬性&#xff0c;會結束嵌套數函數 return average() …

Ubuntu 桌面系統升級

本文介紹 Ubuntu 桌面系統升級的兩種方式&#xff0c;通過 UI 或命令行的方式&#xff0c;演示為 20.04 升級為 22.04。并介紹了 windows 的 Linux 子系統 wsl 的升級注意事項。背景之前在學習 ROS2 時&#xff0c;安裝 ros-humble-desktop 出現依賴錯誤&#xff1a;無法修正錯…

onlyoffice修改左上角的logo

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/770 1. 商用版config里配置就能修改logo "editorConfig": {"customization": {"logo": {"image": "https://example.com/logo.png","imageEmbedded&q…

pidgin qq_Pidgin入門指南,通用消息客戶端

pidgin qqIf you find chatting with multiple chat clients troublesome, then Pidgin is the tool for you. In today’s article, we’ll show you how to connect to popular chat networks, encrypt your conversations, and render mathematical formula in Pidgin. 如果…

NumPy學習_00 ndarray的創建

1.使用array()函數創建數組 參數可以為&#xff1a;單層或嵌套列表&#xff1b;嵌套元組或元組列表&#xff1b;元組或列表組成的列表 # 導入numpy庫import numpy as np # 由單層列表創建a np.array([1,2,3])print(a) [1 2 3] # 由嵌套列表創建b np.array([[1.3,2.4], [0.3,4…

記一次 .NET 某自動化采集軟件 崩潰分析

一&#xff1a;背景 1.講故事前段時間有位朋友找到我&#xff0c;說他的程序在客戶的機器上跑著跑著會出現偶發卡死&#xff0c;然后就崩掉了&#xff0c;但在本地怎么也沒復現&#xff0c;dump也抓到了&#xff0c;讓我幫忙看下到底怎么回事&#xff0c;其實崩潰類的dump也有簡…

onlyoffice修改字號

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/758 :/var/www/onlyoffice/documentserver/web-apps/apps/documenteditor/main/app.js 里找到{value:22,displayValue:"22"} 把displayValue對應的值換成漢字字體 小二等 其實中文數字&#xff08;字…