C++命名空間(namespace)

c++中,名稱(name)可以是符號常量、變量、函數、結構、枚舉、類和對象等等。工程越大,名稱互相沖突性的可能性越大。另外使用多個廠商的類庫時,也可能導致名稱沖突。為了避免,在大規模程序的設計中,以及在程序員使用各種各樣的C++庫時,這些標識符的命名發生沖突,標準C++引入關鍵字namespace(命名空間/名字空間/名稱空間),可以更好地控制標識符的作用域。

?

創建一個命名空間:

namespace A{int a = 10;
}
namespace B{int a = 20;
}
void test(){cout << "A::a : " << A::a << endl;cout << "B::a : " << B::a << endl;
}

?

命名空間只能全局范圍內定義(以下錯誤寫法

void test(){namespace A{int a = 10;}namespace B{int a = 20;}cout << "A::a : " << A::a << endl;cout << "B::a : " << B::a << endl;
}

?

命名空間可嵌套命名空間

namespace A{int a = 10;namespace B{int a = 20;}
}
void test(){cout << "A::a : " << A::a << endl;cout << "A::B::a : " << A::B::a << endl;
}

?

命名空間是開放的,即可以隨時把新的成員加入已有的命名空間中

namespace A{int a = 10;
}namespace A{void func(){cout << "hello namespace!" << endl;}
}void test(){cout << "A::a : " << A::a << endl;A::func();
}

?

聲明和實現可分離

?

#pragma oncenamespace MySpace{void func1();void func2(int param);
}

?

void MySpace::func1(){cout << "MySpace::func1" << endl;
}
void MySpace::func2(int param){cout << "MySpace::func2 : " << param << endl;
}

?

無名命名空間,意味著命名空間中的標識符只能在本文件內訪問,相當于給這個標識符加上了static,使得其可以作為內部連接

namespace{int a = 10;void func(){ cout << "hello namespace" << endl; }
}
void test(){cout << "a : " << a << endl;func();
}

?

命名空間別名

namespace veryLongName{int a = 10;void func(){ cout << "hello namespace" << endl; }
}void test(){namespace shortName = veryLongName;cout << "veryLongName::a : " << shortName::a << endl;veryLongName::func();shortName::func();
}

?

------------------------------------------------------------------------------------------------------------------------------------------------------------

using聲明

using聲明可使得指定的標識符可用。

namespace A{int paramA = 20;int paramB = 30;void funcA(){ cout << "hello funcA" << endl; }void funcB(){ cout << "hello funcA" << endl; }
}void test(){//1. 通過命名空間域運算符cout << A::paramA << endl;A::funcA();//2. using聲明using A::paramA;using A::funcA;cout << paramA << endl;//cout << paramB << endl; //不可直接訪問
    funcA();//3. 同名沖突//int paramA = 20; //相同作用域注意同名沖突
}

using聲明碰到函數重載? ? ?

如果命名空間包含一組用相同名字重載的函數,using聲明就聲明了這個重載函數的所有集合。

 1 namespace A{
 2     void func(){}
 3     void func(int x){}
 4     int  func(int x,int y){return x+y;}
 5 }
 6 void test(){
 7     using A::func;
 8     func();
 9     func(10);
10     func(10, 20);
11 }

?--------------------------------------------------------------------------------------------------------------

using編譯指令

?

using編譯指令使整個命名空間標識符可用.

?注意:使用using聲明或using編譯指令會增加命名沖突的可能性。也就是說,如果有名稱空間,并在代碼中使用作用域解析運算符,則不會出現二義性。

namespace A{int paramA = 20;int paramB = 30;void funcA(){ cout << "hello funcA" << endl; }void funcB(){ cout << "hello funcB" << endl; }
}void test01(){using namespace A;cout << paramA << endl;cout << paramB << endl;funcA();funcB();//不會產生二義性int paramA = 30;cout << paramA << endl;
}namespace B{int paramA = 20;int paramB = 30;void funcA(){ cout << "hello funcA" << endl; }void funcB(){ cout << "hello funcB" << endl; }
}void test02(){using namespace A;using namespace B;//二義性產生,不知道調用A還是B的paramA//cout << paramA << endl;
}

?

?

?

命名空間使用

需要記住的關鍵問題是當引入一個全局的using編譯指令時,就為該文件打開了該命名空間,它不會影響任何其他的文件,所以可以在每一個實現文件中調整對命名空間的控制。
比如,如果發現某一個實現文件中有太多的using指令而產生的命名沖突,就要對該文件做個簡單的改變,通過明確的限定或者using聲明來消除名字沖突,這樣不需要修改其他的實現文件。

?

轉載于:https://www.cnblogs.com/mmc9527/p/10429360.html

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

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

相關文章

P1556 幸福的路

題意&#xff1a;平面內有N頭牛$N\le 10$john從&#xff08;0,0&#xff09;出發&#xff0c;最后回到(0,0) 只有走到牛那里john才可以改變方向&#xff0c;否則沿著直線走 問john經過每一頭牛并且在每一頭牛出恰好改變方向一次的方案&#xff08;牛可以經過多次&#xff0c;但…

Class.getResource和ClassLoader.getResource

一案例驅動 二源碼分析 三類加載器ClassLoader 四總結 五參考 一案例驅動 最近加載文件的時候遇到了一個問題&#xff0c;很有意思&#xff01; 具體看下面案例代碼 public class TestClassLoader {public static void main(String[] args) {System.out.println(TestClassLoad…

spring-6、動態代理(cglib 與 JDK)

JDK動態代理與Cglib動態代理 JDK動態代理: 1.能夠繼承靜態代理的全部優點.并且能夠實現代碼的復用.2.動態代理可以處理一類業務.只要滿足條件 都可以通過代理對象進行處理.3.動態代理的靈活性不強.4.JDK 的動態代理要求代理者必須實現接口, , 否則不能生成代理對象. . 1 packag…

JDK安裝與配置(Windows 7系統)

1.前言 安裝之前需弄清JDK、JRE、JVM這幾個概念&#xff0c;不然稀里糊涂不知道自己在裝什么。 &#xff08;1&#xff09;什么是java環境&#xff1a;我們知道&#xff0c;想聽音樂就要安裝音樂播放器&#xff0c;想看圖片需要安裝圖片瀏覽器&#xff0c;同樣道理&#xff0c;…

UVA839

這道題又是一道遞歸的題目 先貼上代碼 //這種沒有明確說個數的動態分配還是得用new #include<cstdio> #include<iostream> using namespace std; struct mobile {int WL,DL,WR,DR;mobile *left,*right;mobile(mobile *aNULL,mobile*bNULL):left(a),right(b){} }; m…

Thread.getContextClassLoader與Thread.getClassLoader()區別

在閱讀spring boot啟動時候的源碼中&#xff0c;發現獲取classLoader使用的是getContextClassLoader于是乎產生了疑問&#xff0c;這種獲取ClassLoader的方式與我們最常見的通過Class.getClassLoader二者有什么區別&#xff1f;都是在什么場景下使用呢&#xff1f; 首先來看看…

ssl 的jks 生成工具

https://www.myssl.cn/tools/merge-jks-cert.html 通過key 私鑰 &#xff0c;和公鑰pem 生成jks 轉載于:https://www.cnblogs.com/vana/p/9594298.html

NOIP模擬賽10 題解

t3&#xff1a; 題意 給你一棵樹&#xff0c;然后每次兩種操作&#xff1a;1.給一個節點染色 &#xff1b; 2. 查詢一個節點與任意已染色節點 lca 的權值的最大值 分析 考慮一個節點被染色后的影響&#xff1a;令它的所有祖先節點&#xff08;包括自身&#xff09;的所有除去更…

洛谷 P1136 迎接儀式 解題報告

P1136 迎接儀式 題目描述 LHX教主要來X市指導OI學習工作了。為了迎接教主&#xff0c;在一條道路旁&#xff0c;一群Orz教主er穿著文化衫站在道路兩旁迎接教主&#xff0c;每件文化衫上都印著大字。一旁的Orzer依次擺出“歡迎歡迎歡迎歡迎……”的大字&#xff0c;但是領隊突然…

spring源碼分析-core.io包里面的類

前些日子看《深入理解javaweb開發》時&#xff0c;看到第一章java的io流&#xff0c;發覺自己對io流真的不是很熟悉。然后看了下JDK1.7中io包的一點點代碼&#xff0c;又看了org.springframework.core.io包的一些類和組織方式&#xff0c;當作是學習吧。總結一下。 先掛下spri…

對類Vue的MVVM前端庫的實現

關于實現MVVM&#xff0c;網上實在是太多了&#xff0c;本文為個人總結&#xff0c;結合源碼以及一些別人的實現 關于雙向綁定 vue 數據劫持 訂閱 - 發布ng 臟值檢查backbone.js 訂閱-發布(這個沒有使用過&#xff0c;并不是主流的用法)雙向綁定&#xff0c;從最基本的實現來說…

java.util.prefs.Preferences

我們經常需要將我們的程序中的設定&#xff0c;如窗口位置&#xff0c;開啟過的文件&#xff0c;用戶的選項設定等數據記錄下來&#xff0c;以做便用戶下一次開啟程序能繼續使用這些數據。 以前我們通常的做法是使用Properties類&#xff0c;它提供以下方法: void load(InputS…

django的母板系統

一.母板渲染語法 1.變量 {{ 變量 }} 2.邏輯 {% 邏輯語 %} 二.變量 在母板中有變量時,母板引擎會去反向解析找到這個傳來的變量,然后替換掉. .(點),在母板中是深度查詢據點符,它的查詢順序: 字典 > 屬性或方法 > 數字索引 三.過濾器 1.語法 {{ value|filter_name:參數}} 2…

python學習總結----時間模塊 and 虛擬環境(了解)

python學習總結----時間模塊 and 虛擬環境&#xff08;了解&#xff09; time- sleep&#xff1a;休眠指定的秒數(可以是小數) - time&#xff1a;獲取時間戳# 獲取時間戳(從1970-01-01 00:00:00到此刻的秒數)t time.time()print(t) - localtime&#xff1a;將時間戳轉換為對象…

【CSS】flex的常用布局

1、垂直居中&#xff0c;寫在父級上div{display: flex;justify-content: center;align-items: center; } 2、flex-左右兩端&#xff0c;垂直居中該布局在移動端較為常見<style> .wrap{display: flex;justify-content: space-between;align-items: center;width: 200px;he…

java.util.Properties

ava.util.Properties是對properties這類配置文件的映射。支持key-value類型和xml類型兩種 首先&#xff0c;新建一個文件&#xff0c;如圖&#xff1a; 然后再Java代碼段輸入如下代碼&#xff1a; import java.io.FileInputStream; import java.io.InputStream; import java…

Xpath使用方法

Xpath使用方法 注&#xff1a;默認死格式 先寫 //* 代表定位頁面下所有元素 1、Xpath支持ID、Class、Name定位功能 通過ID定位 //*[idkw]通過Class定位//*[classclass_name]通過Name定位//*[namename]-----------------------------------------------------------------------…

為什么這么多爛代碼?

在國內&#xff0c;有經驗的程序員都當領導了&#xff0c;領導又不寫代碼&#xff0c;那代碼只能讓剛入行的新手寫了&#xff0c;然后就是隨意堆砌&#xff0c;完成功能就行&#xff0c;所以目前我盡量不寫爛代碼&#xff0c;并盡量堅持改造已有的爛代碼&#xff0c;在我眼中&a…

Spring-boot 打成jar包后使用外部配置文件

官網說明 第一種是在jar包的同一目錄下建一個config文件夾&#xff0c;然后把配置文件放到這個文件夾下&#xff1b; 第二種是直接把配置文件放到jar包的同級目錄&#xff1b; 第三種在classpath下建一個config文件夾&#xff0c;然后把配置文件放進去&#xff1b; 第四種是在c…

acm模板生成

為迎接&#xff0c;接下來的區域賽&#xff0c;要做好準備(雖然不是特別有信心&#xff0c;但是還是要鼓勵自己&#xff0c;可以取得收獲的&#xff0c;加油) acm_latex模板&#xff1a; https://www.cnblogs.com/palayutm/p/6444833.html#e69bb4e696b0_1 windows下安裝texlive…