命名空間+缺省參數+const總結+引用總結+內聯函數+auto關鍵字 C++初階

命名空間概述在C/C++中 , 變量、函數和后面要學到的類都是大量存在的 , 這些變量、函數和類的名稱將都存在于全局作用域中,可能會導致很多沖突 。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染,namespace關鍵字的出現就是針對這種問題的 。
舉個例子:
#include <stdio.h>#include <stdlib.h>int rand = 10;int main(){ printf("%d", rand); return 0;}程序編譯的結果顯示rand重定義了,為什么會這樣呢?因為在stdlib.h這個頭文件中已經定義了rand這樣一個函數,這樣就導致了編譯器不知道這是一個函數還是一個變量,C語言中無法應對這種沖突,只能通過改名字來避免 。

命名空間+缺省參數+const總結+引用總結+內聯函數+auto關鍵字 C++初階

文章插圖
而C++為了解決這個問題,引入了命名空間的概念 。
命名空間的定義定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名空間的成員 。
//命名空間//A就是命名空間的名字namespace A{ int a; void func() {}}注意事項:
  • 命名空間只能寫在全局
  • 命名空間可以嵌套命名空間
  • 命名空間是開放的,隨時可以加入新的成員 , 但是新加入的成員只能在加入后使用
  • 匿名命名空間就類似于static
  • 命名空間可以取別名
  • 分文件編寫的時候,如果頭文件有兩個命名空間,但是里面的成員函數或者成員變量同名的時候,在cpp重實現函數需要加上命名空間
接下來給一個完整的代碼塊來展示命名空間的注意事項和使用:
#include<iostream> //引入頭文件#include<string>//C++中的字符串using namespace std; //標準命名空間//A就是命名空間的名字namespace A{ //命名空間內既可以定義變量也可以定義函數 int rand = 10; int Sub(int x, int y) {return x + y; } struct ListNode {int data;struct ListNode* next; };}//命名空間的嵌套定義namespace B{ int rand; namespace C {int rand; }}//命名空間是開放的,隨時可以加入新成員,但是新成員只能在加入后使用namespace B{ int c;//此時c會合并到命名空間B中 , 實際上就是個合并的過程}//匿名命名空間namespace{ int d = 5;//命名空間沒有名字,就類似于static int d = 50 , 是個靜態全局變量,別的文件無法使用}int main(){ //命名空間的使用 //1.::作用域限定符 //訪問A空間的Sub函數 cout << A::Sub(10, 20) << endl; //2.訪問嵌套空間 //訪問B空間的C空間的rand變量 B::C::rand = 5; cout << B::C::rand << endl; system("pause"); return EXIT_SUCCESS;}using關鍵字引入using關鍵字之后,命名空間的使用又變得不一樣
  • 用using將命名空間的成員引入
namespace A{ int a = 10;}void test01(){ //using聲明的意思就是讓命名空間中某個標識符可以直接使用 using A::a; cout<<a<<endl;}注意:
1.使用using聲明,就不會每次寫A::a了,直接用a就可以
2.using A::a聲明的意思就是把變量a又在test函數中定義了一次,此時如果在test內部再定義一個int a;就會出錯
  • 用using namespace 命名空間名稱引入
namespace A{ int a = 10;}using namespace A;void test01(){ cout<<a<<endl;}使用using關鍵字修飾namespace整個命名空間,實際上就是脫去了這個命名空間的外衣,就等價于你定義了一個int a在全局
思考一個問題:下面代碼有錯嗎?
在test01函數體內又定義了一個int a,會報錯么?如果不報錯,那么輸出的是全局的 a = 10 還是局部的a  = 20?
namespace A{ int a = 10;}using namespace A;void test01(){ int a = 20; cout<<a<<endl;}答案是不會報錯,輸出的是局部的20,因為命名空間A內部的變量a在使用using關鍵字后相當于在全局定義了一個int a ;而在函數體內定義一個局部的 int a;兩個變量的作用域不同,是可以定義同名變量的 , 輸出的是局部變量的值 , 小伙伴的要注意區分~
C++輸入和輸出