C++命名空間(詳解)

C++基礎語法

C++基于C語言的改進:c++在C語言的基礎上引入并擴充了面向對象的概念

C++基礎概念C++是基于C語言而產生的,它即可以進行C語言的過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行面向對象的程序設計

在1998年 出現C++98 C++成熟 他是標準第一個版本 引入了STL 標準模板庫

C++總共63個關鍵字,其中包括C語言關鍵字32個


1.命名空間

在C/C++中,變量、函數和后面要學到的類都是大量存在的,這些變量、函數和類的名稱將都存在于全局作用域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染,namespace關鍵字的出現就是針對這種問題的。

這是C語言一個缺點:

例如:

//使用rand定義一個全局變量 沒有問題 輸出0
int rand = 0;int main()
{printf("%d ", rand);return 0;
}

如果引用頭文件stdlib rand是個函數 導致命名沖突 編譯失敗

假如:日常你使用一個變量名稱 你不知道他是庫函數中的函數 那么會導致命名沖突

命名空間用來做名字隔離 防止命名沖突

如果沒有命名空間 如果名字沖突了 整個項目上千個名字 改起來很麻煩

如果以后去公司 分組完成一個項目 單獨寫都沒有問題 很多小組難免會命名沖突,我們該如何避免這種狀況

如果是C語言的話 只能商量一下 兩個人其中的一個人被迫修改名字

但是C++有方式解決方式,引入命名空間 新增關鍵字 namespace

命名空間的定義

定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名

普通的命名空間:

例如:

#include <iostream>
namespace zhr
{int a = 0;
}

namespace后面可以定義一個名字 這個名字就是域

命名空間定義的是命名空間域

命名空間域的變量生命周期是全局,但是它屬于該命名空間域

C語言早早就接觸過 同一個域不可以定義同一個變量 不同的域可以定義相同的變量

域會影響訪問和生命周期

: :? 域作用限定符 指定從域作用限定符左邊的域去找 如果左邊的域是空白 表示全局域 去全局域找

#include <stdio.h>
namespace bit
{int a = 2;
}
int a  = 1;
int main()
{int a = 0;printf("%d\n",a);//在局部范圍找  輸出結果是0printf("%d\n", bit::a);//指定命名空間域去找 輸出結果是2//如果非要訪問全局變量中的a呢?  printf("%d\n",::a);//域作用限定符;  輸出結果是1return 0;
}

會輸出局部變量的a 局部優先 就近原則 像訪問局部 局部沒有 再去全局變量中找

命名空間不只是可以定義變量 還可以定義函數 結構體

直接調用調用不到函數 命名空間是函數找的規則 默認在全局變量去找 默認不會在命名空間去找 必須指定才會去找

namespace bit
{int rand = 0;void func(){printf("func()\n");n }struct TreeNode{struct TreeNode* left;struct TreeNode* right;int val;};
}int main()
{func();//直接調用是調用不到的bit::func();//只需要在func前加bit::就可以調用到了struct TreeNode node;//這里也同理struct bit::TreeNode node;//但是這里命名空間要放在結構體名稱前面return 0;
}

命名空間可以嵌套

#include <iostream>namespace hhh
{namespace zhr{int a = 10086;    }
}
int main()
{printf("%d\n",hhh::zhr::a);return 0;
}

3. 同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中

注意:一個命名空間就定義了一個新的作用域,命名空間中的所有內容都局限于該命名空間中

不可以直接調用該命名空間里的變量和函數 需要使用:: 域作用限定符

命名空間的使用有三種方式:

1.加命名空間名稱及作用域限定符:

using namespace std;
namespace N
{int a = 886;int b = 0;
}
int main()
{printf("%d\n", N::a);return 0;
}

2.使用using將命名空間中成員引入

using namespace std;
namespace N
{int a = 886;int b = 520;
}
using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0;
}

3.使用using namespace 命名空間名稱引入

using namespace std;namespace N
{int a = 886;int b = 520;int c = 666;
}
using namespace N;using N::b;
int main()
{printf("%d\n", a);printf("%d\n", b);printf("%d\n", c);return 0;
}

使用命名空間的建議

1.項目中盡量不用using namespace std;

std是標準庫的命名空間

2.日常練習用using namespace std;

3.項目中,指定命名空間訪問+展開常用的

2.C++輸入&輸出

C++的第一個代碼:hello World

知道了命名空間 這回知道了每次寫C++代碼前都要加

using namespace std;std是C++標準庫的命名空間

如果直接展開std 會把庫全部暴露出來 在項目中不適用

1.使用cout標準輸出(控制臺)和cin標準輸入(鍵盤)時,必須包含< iostream >頭文件以及std標準命名空間。

注意:早期標準庫將所有功能在全局域中實現,聲明在.h后綴的頭文件中,使用時只需包含對應頭文件即可,后來將其實現在std命名空間下,為了和C頭文件區分,也為了正確使用命名空間,規定C++頭文件不帶.h;舊編譯器(vc 6.0)中還支格式,后續編譯器已不支持,因此推薦使用+std的方式。

2. 使用C++輸入輸出更方便,不需增加數據格式控制,比如:整形--%d,字符--%c

#include <iosream>using namespace std;//std是C++標準庫的命名空間
int main()
{int i, d;cin >> i >> d; //流提取cout << "Hello World" << endl;//  endl是換行 相當于'\n';cout << i << ' ' << d << endl;//這里的<<是流插入 自動識別類型cout << "hello world" << endl;  //這里相當于把一個char數組流插入到控制臺     return 0;
}

個人水平不足 如果代碼中有錯誤,可以多多在評論區指出,一定會及時修改!
謝謝大家看到這里 覺得有收獲的話可以三連一下 一起加油!

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

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

相關文章

愛普生差分晶振在光模塊中的重要角色

光模塊是現代通信設備中的重要組成部分&#xff0c;主要用于實現光電轉換和信號傳輸&#xff0c;它是一種將光信號轉換為電信號&#xff0c;或者將電信號轉換為光信號的設備。在光纖通信中&#xff0c;光模塊扮演著至關重要的角色。 光模塊的主要組成部分包括光源、光接收器、…

OSPF學習筆記(狀態機)

1、鄰居關系 OSPF設備啟動后&#xff0c;會通過OSPF接口向外發送Hello報文&#xff0c;收到Hello報文的OSPF設備會檢查報文中所定義的參數&#xff0c;如果雙方一致就會形成鄰居關系&#xff0c;兩端設備互為鄰居 2、鄰接關系 形成鄰居關系后&#xff0c;如果兩端設備成功交…

【代碼隨想錄】【算法訓練營】【第27天】 [39]組合總和 [40] 組合總和II [131]分割回文串

前言 思路及算法思維&#xff0c;指路 代碼隨想錄。 題目來自 LeetCode。 day26&#xff0c; 休息的周末~ day 27&#xff0c;周一&#xff0c;庫存沒了&#xff0c;哭死~ 題目詳情 [39] 組合總和 題目描述 39 組合總和 解題思路 前提&#xff1a;組合的子集問題&…

C# :IQueryable IEnumerable

文章目錄 1. IEnumerable2. IQueryable3. LINQ to SQL4. IEnumerable & IQueryable4.1 Expression4.2 Provider 1. IEnumerable namespace System.Collections: public interface IEnumerable {public IEnumerator GetEnumerator (); }public interface IEnumerator {pubi…

氣泡式水位計施工技術要求

1、氣泡式水位計壓力氣管出氣口應安裝并固定在最低水位處&#xff0c;其壓力氣管也應固定&#xff0c;有條件的可用金屬管或塑料管保護。氣泡式水位計安裝示意圖見附圖。 2、安裝要求 1&#xff09;檢查氣泡式水位計氣管外觀有無破損及變形&#xff1b; 2&#xff09;旋開帶有…

面試數據庫八股文十問十答第十期

面試數據庫八股文十問十答第十期 作者&#xff1a;程序員小白條&#xff0c;個人博客 相信看了本文后&#xff0c;對你的面試是有一定幫助的&#xff01;關注專欄后就能收到持續更新&#xff01; ?點贊?收藏?不迷路&#xff01;? 1&#xff09;為什么不推薦多表Join&…

特征工程技巧—Bert

前段時間在參加比賽&#xff0c;發現有一些比賽上公開的代碼&#xff0c;其中的數據預處理步驟值得我們參考。 平常我們見到的都是數據預處理&#xff0c;現在我們來講一下特征工程跟數據預處理的區別。 數據預處理是指對原始數據進行清洗、轉換、縮放等操作&#xff0c;以便為…

Blackwell未來發展之路究竟如何?

英偉達Blackwell如何重塑AI計算的未來&#xff1f; 前言 臺灣大學演講 就在6月2日&#xff0c;英偉達CEO黃仁勛在中國臺灣大學綜合體育館發表了最新的演講。這次黃仁勛的演講依舊重磅&#xff0c;更值得注意的是這次演講中還透露了Blackwell今后的發展之路。 介紹Blackwell 介紹…

MongoDB CRUD操作:地理位置查詢

MongoDB CRUD操作&#xff1a;地理位置查詢 文章目錄 MongoDB CRUD操作&#xff1a;地理位置查詢地理空間數據GeoJSON對象傳統坐標對通過數組指定&#xff08;首選&#xff09;通過嵌入文檔指定 地理空間索引2dsphere2d 地理空間查詢地理空間查詢運算符地理空間聚合階段 地理空…

拿筆記下來!產品采購制造類合同怎樣寫比較穩妥?

拿筆記下來&#xff01;產品采購制造類合同怎樣寫比較穩妥&#xff1f; 近日&#xff0c;幾經波折&#xff0c;泰中兩國終于完成了潛艇采購談判&#xff01;你知道嗎&#xff1f;產品制造類合同或協議在起草前如果沒有充分考慮各種因素&#xff0c;可能會導致一系列問題和不利…

C語言學習:數據類型

一、 為什么要引入數據類型 ? 計算機中每個字節都有一個地址&#xff08;類似門牌號&#xff09; ? CPU通過 地址 來訪問這個字節的空間 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

linux c socket編程里SO_REUSEADDR的作用

比如下面的代碼 int reuse 1; int ret setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse)); if (ret SOCKET_ERROR) {log_error("_SetReuseAddr failed, err_code%d, fd%d", _GetErrorCode(), fd); }代碼解釋 setsockopt 函數用于設置…

無人監控視頻輸出卡頓狀態

設計思路&#xff0c;如下&#xff1a; 1.通過采集卡將視頻信號輸出到個人PC中 2.PC按設置好的時間&#xff0c;視頻屬性分片保存 3.將步驟2中的視頻&#xff0c;按預處理要求&#xff0c;得到待計算的視頻片段 4.使用SSIM算法計算預處理后的視頻&#xff0c;將計算得到的數據存…

聊天機器人的實踐過程

一、語聊機器人 OpenAI 的爆火&#xff0c;到如今也才一年多的時間&#xff0c;然而在過去的一年中&#xff0c;生成式AI的落地場景幾乎 80%都是 ChatBot 的形式&#xff0c;那么今天這篇文章我們就來聊一下&#xff0c;生成式AI和IM能擦出怎么樣的火花&#xff1f;以及各種場…

p13idea的其他操作

1 導入模塊 錯誤示范&#xff1a; 正確示范&#xff1a; 2 刪除模塊 必須用delete才能刪除干凈&#xff0c;用remove刪了之后還要回到文件里面把它刪除掉

有錢還系統源碼 人人還眾籌還錢模式還貸系統源碼

盈利模式&#xff1a; 1.系統里直推400 2.間推得200 3.升級是隔代匹配200 4.漏單直接設置歸系統 5.九級匹配不到直接歸平臺 有錢還平臺新注冊會員&#xff0c;即新入的負債者要分9次分別資助先來的11名負債者每人200元&#xff0c;這筆資助不是一次性給到對方&#xff0c…

Prism 入門04,導航功能

當前章節,沿用 上一章使用Prism 框架創建的WPF 項目空模板。在上一章節,各個不同的模塊之間能夠進行切換并把內容呈現在主程序的頁面當中(其實是通過在主程序中注冊的區域去發起一個導航的請求,然后跳轉到對應的視圖。也就是實現了導航跳轉功能)。 為什么能實現導航的跳轉?…

Mybatis的一級緩存

緩存 MyBatis 包含一個非常強大的查詢緩存特性,它可以非常方便地配置和定制。MyBatis 3 中的緩存實現的很多改進都已經實現了,使得它更加強大而且易于配置。 Mybatis和Hibernate一樣&#xff0c;也有一級和二級緩存&#xff0c;同樣默認開啟的只有一級緩存&#xff0c;二級緩…

docker-compose安裝多環境apollo

下載數據庫sql文件 https://github.com/apolloconfig/apollo/blob/master/scripts/sql/src/apolloconfigdb.sql https://github.com/apolloconfig/apollo/blob/master/scripts/sql/src/apolloportaldb.sql 創建庫并導入表 #生產環境 mysql> CREATE DATABASE IF NOT EXIS…

腦部磁共振成像腫瘤分割方法(MATLAB 2018)

近年腦腫瘤發病率呈上升趨勢&#xff0c;約占全身腫瘤的5%&#xff0c;占兒童腫瘤的70%。CT、MRI等多種影像檢查方法可用于檢測腦腫瘤&#xff0c;其中MRI應用于腦腫瘤成像效果最佳。精準的腦腫瘤分割是病情診斷、手術規劃及后期治療的必備條件&#xff0c;既往研究者對腦部腫瘤…