【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )
生活随笔
收集整理的這篇文章主要介紹了
【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 命名空間簡介
- 自定義命名空間
- 自定義嵌套命名空間
- 域作用符
- 命名空間 與 include 區(qū)別
- 命名空間定義與使用完整代碼
命名空間簡介
命名空間 ( namespace ) :
- 1.命名空間簡介 : C++ 中的命名空間相當(dāng)于 Java 中的 Package 包 , 最常用的命名空間是 std , 基本每個項目都要使用 , 代碼如下 :
- 2.命名空間作用 : 平時使用的 cout , endl 等都是在 std 命名空間 中定義的 , 如果不聲明 std 命名空間 , 那么命令行輸出使用的 cout 和 endl 必須使用 域作用符 "::" 進(jìn)行訪問 ;
- ① 域作用符訪問方法 : 命名空間 :: 變量名
- ② 不聲明 std 命名空間使用 cout 方法 : std::cout
- ③ 不聲明 std 命名空間使用 endl方法 : std::endl
- 3.執(zhí)行結(jié)果 :
自定義命名空間
自定義命名空間 ( namespace ) :
- 1.定義方式 : 使用 “namespace 命名空間名稱 {}” 格式 , 定義命名空間 , 可以將變量和方法定義在命名空間中 ;
- 2.聲明自定義的命名空間 : 使用 “using namespace 命名空間名稱;” 聲明命名空間 ; 下面是聲明命名空間 與 不聲明 的區(qū)別 :
- ① 聲明命名空間 : 可以直接調(diào)用命名空間中的方法 ;
- ② 沒有聲明該命名空間 : 就必須使用 “命名空間名稱::方法名()” 域作用符調(diào)用命名空間定義的方法 ;
- 3.訪問命名空間中的方法 ( 沒有聲明的情況下 ) : 如果沒有聲明命名空間 , 需要調(diào)用 “命名空間名稱::方法名()” 的方式調(diào)用命名空間中的方法 , 這里想要調(diào)用 mynamespace 命名空間的 say_hi() 方法 , 就需要按照下述代碼進(jìn)行操作 ;
- 4.訪問命名空間中的方法 ( 已經(jīng)聲明的情況下 ) : 如果已經(jīng)聲明了命名空間 , 就可以直接調(diào)用命名空間中的方法 , 不需要使用 域作用符 訪問命名空間中的方法 ;
- 5.命名空間相關(guān)的代碼 : 包括 ① 命名空間定義 , ② 聲明 , ③ 使用 ( a. 聲明命名空間 / b. 未聲明命名空間 ) 的代碼 ;
- 6.代碼執(zhí)行結(jié)果 :
自定義嵌套命名空間
自定義嵌套命名空間 :
- 1.嵌套命名空間簡介 : 命名空間內(nèi)部再定義一個命名空間 , 這種情況就是嵌套的命名空間 ; 如下代碼 , myinnernamespace 就是定義的內(nèi)層的命名空間 , 如果要訪問內(nèi)層命名空間的方法 , 需要兩個域作用符才能訪問 ;
- 2.聲明外層命名空間 : 需要使用 “using 外層命名空間名稱;” 方式進(jìn)行聲明 ;
- 3.聲明內(nèi)層命名空間 : 需要使用 “using 外層命名空間名稱::內(nèi)層命名空間名稱;” 方式進(jìn)行聲明 ;
- 4.嵌套命名空間訪問 : 需要使用兩個域作用符進(jìn)行訪問 , 格式是 “外層命名空間::內(nèi)層命名空間::內(nèi)層命名空間定義的方法或變量名稱” ;
- 5.不聲明命名空間的訪問方式 : 此時就需要完整的使用兩個域作用符訪問內(nèi)層命名空間中的方法或變量 , 代碼如上面的代碼
- 6.聲明外層命名空間的訪問方式 : 此時可以不使用外層的命名空間名稱 , 直接使用 “內(nèi)層命名空間名稱::方法名()” 訪問內(nèi)層命名空間中定義的方法 ;
- ① 省略外層命名空間 : 只聲明了外層命名空間 , 這里就可以省略上面的外層命名空間 ;
- ② 不能省略內(nèi)層命名空間 : 內(nèi)層的命名空間不能省略 , 因為沒有聲明內(nèi)部命名空間 ;
- ③ 域作用符個數(shù) : 需要一個域作用符訪問內(nèi)層命名空間中的方法 ;
- 7.聲明內(nèi)層命名空間的訪問方式 : 如果內(nèi)層的命名空間被聲明 , 那么可以不使用域作用符 , 直接訪問內(nèi)層命名空間中的方法 ;
- 8.嵌套命名空間代碼示例 : ① 命名空間定義 , ② 命名空間聲明 , ③ 命名空間調(diào)用 ;
- 9.執(zhí)行結(jié)果 :
域作用符
域作用符 :
- 1.域作用符的作用 : 主要有兩個作用 ;
- ① 訪問命名空間 : 一個是訪問命名空間中的變量和方法 ;
- ② 訪問類成員 : 另一個是調(diào)用類中的方法 或 成員變量 ;
上述訪問命名空間中的方法已經(jīng)展示過了 , 下面介紹下訪問類成員變量 ;
- 2.定義類中的成員變量 : 該變量定義在類中 ;
- 3.在方法中定義一個同名的成員變量 : 注意類中的成員變量與方法中的局部變量賦值不同 , 用于區(qū)分兩個變量 ;
- 4.使用域作用符訪問類成員變量 : 訪問類中的變量格式為 “::變量名” , 如 ::a_int ;
- 5.代碼示例 :
- 6.執(zhí)行結(jié)果 :
命名空間 與 include 區(qū)別
在 C++ 代碼中 , 經(jīng)常遇到 #include "c_extern.h" 和 using namespace std; 代碼 , 兩種方式都可以聲明可使用的若干變量和方法 ;
- include 作用 : 將包含的文件 在編譯時 拷貝到 這個文件中 , 如上面 #include "c_extern.h" , 在編譯時就將 c_extern.h 頭文件中的內(nèi)容 , 全部拷貝到本文件中 使用 #include "c_extern.h" 的位置 ;
- 命名空間的作用 : 表明后面所有的代碼都使用這個命名空間 , 如果調(diào)用命名空間中的方法, 就會去對應(yīng)的命名空間中查找對應(yīng)方法;
函數(shù)完全重復(fù)的情況 : 如果出現(xiàn)兩個函數(shù) , 其 ① 函數(shù)名 ② 參數(shù)個數(shù) ③ 參數(shù)順序 ④ 返回值 完全重復(fù) , 這樣就會造成沖突 ;
命名空間作用 : 命名空間就是避免出現(xiàn)上述函數(shù)完全重復(fù)的情況 , 可以將重復(fù)的函數(shù)定義在命名空間中 , 這樣就能區(qū)分兩個完全相同的函數(shù) ;
命名空間定義與使用完整代碼
代碼中包含部分 C/C++ 兼容 , C/C++ 字符串 相關(guān)代碼 , 屬于上一篇博客遺留, 可忽略 , 只看命名空間相關(guān)的代碼 ;
// 001_CMake_1.cpp: 定義應(yīng)用程序的入口點。 //#include "001_CMake_1.h" #include "c_extern.h"//命名空間定義 : 自定義命名空間 namespace mynamespace {//調(diào)用時 需要調(diào)用 mynamespace::say_hi() 方法進(jìn)行調(diào)用void say_hi() {//注意 : 下面的 cout 和 endl 定義在 std 命名空間中//如果沒有聲明 using namespace std; , 就必須使用域作用符號 "::" 才能訪問//域作用符格式 : 命名空間::調(diào)用內(nèi)容std::cout << "自定義命名空間 mynamespace say_hi() 方法 : Hi!" << std::endl;}//嵌套的命名空間需要調(diào)用 mynamespace::myinnernamespace::say_hi() 才能調(diào)用該方法namespace myinnernamespace {void say_hi_inner() {//注意 : 下面的 cout 和 endl 定義在 std 命名空間中//如果沒有聲明 using namespace std; , 就必須使用域作用符號 "::" 才能訪問//域作用符格式 : 命名空間::調(diào)用內(nèi)容std::cout << "自定義嵌套的命名空間 myinnernamespace say_hi_inner() 方法 : Hi Inner!" << std::endl;}} }using namespace std;//聲明自定義的命名空間 , 聲明 外層命名空間 , //可以直接調(diào)用 say_hi() 方法 ; //調(diào)用內(nèi)層的 say_hi_inner() 方法需要使用 myinnernamespace::say_hi_inner() 進(jìn)行調(diào)用 using namespace mynamespace;//聲明內(nèi)層的命名空間 , 需要使用 外層命名空間::內(nèi)層命名空間 進(jìn)行聲明 //這樣就可以直接調(diào)用內(nèi)層命名空間的 say_hi_inner() 方法了 using namespace mynamespace::myinnernamespace;//類的成員變量 int a_int = 888;//定義方法接收 int& 引用類型變量 //并在方法中修改該變量的值 void quote(int& b) {b = 888; }int main() {cout << "Hello CMake。" << endl;//1. C C++ 兼容//博客地址 : https://hanshuliang.blog.csdn.net/article/details/98840708//調(diào)用 c_extern.h 頭文件中定義的方法//該方法定義在了 C 語言文件中add(1, 2);//2. 引用數(shù)據(jù)類型//博客地址 : https://hanshuliang.blog.csdn.net/article/details/99239635//代碼 展示 流程 : //① 定義 普通 類型 變量int a = 8;//② 定義 引用類型變量, 格式 : 類型名稱& 變量名 = 對應(yīng)類型變量名稱 ;int& b = a;//③ 調(diào)用函數(shù)傳入引用類型參數(shù) : 將引用類型傳給接收引用類型的方法quote(b);//④ 打印引用數(shù)據(jù)類型的修改結(jié)果 , 結(jié)果是 b 被修改成了 888cout << b << endl;//引用數(shù)據(jù)類型定義與使用 : // ① 引用數(shù)據(jù)類型定義 : 類型名稱& 變量名 = 對應(yīng)類型變量名稱 ;// ② 引用數(shù)據(jù)類型的使用方法 : 直接當(dāng)做原來的變量使用即可, 可以替換原來變量的位置使用//引用類型解析 : // ① int& 是引用數(shù)據(jù)類型 , b 是 a 的引用 // ② 分配一塊內(nèi)存存放 int 類型數(shù)據(jù) 8 , 將該內(nèi)存賦予一個別名 a// ③ 同時又給該內(nèi)存賦予另外一個別名 b //3. 字符串使用//C 字符串//博客地址 : https://hanshuliang.blog.csdn.net/article/details/99295034//C 字符串 表示方法 : // ① 字符數(shù)組 : 本質(zhì)是 字符 數(shù)組 char[] , 這里注意字符數(shù)組要以 NULL 或 '\0' 結(jié)尾; char string_c[] = { 'h', 'e', 'l', 'l', 'o', '\0' };// ② 指針 : 使用指針形式表示字符串 , 默認(rèn)末尾增加 '\0' ;char* string_c_p = "hello";//字符串打印 : // ① 打印字符串 , cout 后的 << 后可以打印 字符串 , 也可以打印變量// ② 輸出 cout << 字符串或變量1 << 字符串或變量2 ... << endl 可以拼接 輸出信息cout << "string_c : " << string_c << endl;cout << "string_c_p : " << string_c_p << endl;//C 語言中的字符串操作//拷貝字符串 char string_c_copy_destination[6];char string_c_copy_source[] = { 'h', 'e', 'l', 'l', 'o', '\0' };// ① 參數(shù) : strcpy 方法是拷貝字符串的方法 , 第一個參數(shù)是目標(biāo)字符串 , 第二個參數(shù)是源字符串// ② 作用 : 該方法是將 源字符串 拷貝到 目標(biāo)字符串中strcpy(string_c_copy_destination, string_c_copy_source);// ③ 打印拷貝結(jié)果 : cout << "string_c_copy_destination : " << string_c_copy_destination << endl;//拼接字符串 //① 定義目標(biāo)字符串 : 拼接字符串的目標(biāo)字符串的大小一定要大于等于要拼接的兩個字符串大小之和, 否則會報錯char string_c_cat_destination[50] = " cat dst ";char string_c_cat_source[] = " cat src ";//② 拼接字符串方法參數(shù) : 第一個參數(shù)是目標(biāo)字符串 , 第二個參數(shù)是源字符串//③ 目標(biāo)字符串大小 : 注意 目標(biāo)字符串的 大小一定要大于 兩個字符串實際大小strcat(string_c_cat_destination, string_c_cat_source);//④ 打印字符串拼接結(jié)果 : cout << "string_c_cat_destination : " << string_c_cat_destination << endl;//獲取字符串長度//① 參數(shù) : 傳入要獲取的字符串 , 該長度不含 '\0' 結(jié)尾標(biāo)志//② 作用 : 獲取實際的字符串長度 , 即自動識別 '\0' 位置 , 獲取其長度 , 與所占用的內(nèi)存大小無關(guān)char string_c_len[] = { 'h', 'e', 'l', 'l', 'o', '\0' };char string_c_len2[20] = { 'h', 'e', 'l', 'l', 'o', '\0' };char * string_c_len3 = "hello";//① 字符數(shù)組長度 , 測量從開始到 '\0' 的長度, 不包括 '\0'int len1 = strlen(string_c_len);//② 指定大小的字符數(shù)組長度 , 結(jié)果不是指定的大小的值 , 獲取的是實際字符串長度int len2 = strlen(string_c_len2);//③ 指針表示的字符串 , 其獲取的大小是實際字符串大小, 不包含自動添加的 '\0' int len3 = strlen(string_c_len3);//④ 打印 三個字符串大小cout << "len1 : " << len1<< " len2 : " << len2<< " len3 : " << len3<< endl;//字符串比較// ① 參數(shù)說明 : 參數(shù)是需要比較的兩個字符串 , 第一個參數(shù) str1 , 第二個參數(shù) str2// ② 對比規(guī)則 : str1 和 str2 兩個字符串 , 從左到右 逐個對比 ASCII 碼 大小 ; // a. 如果 str1 等于 str2 , 返回 0; // b. 如果 str1 > str2 , 返回值 大于 0 ;// c. 如果 str1 < str2 , 返回值 小于 0 ;//定義需要比較的字符串char* string_c_comp_1 = "Hello";char* string_c_comp_2 = "Hello";char* string_c_comp_3 = "hello";// ① 兩個字符串相等int cmp_result_1_2 = strcmp(string_c_comp_1, string_c_comp_2);// ② "Hello" 字符串 (H 對應(yīng) ASCII 72) 小于 "hello" 字符串 (h 對應(yīng) ASCII 104) , 返回值 小于 0int cmp_result_1_3 = strcmp(string_c_comp_1, string_c_comp_3);// ③ "hello" 字符串 (h 對應(yīng) ASCII 104) 大于 "Hello" 字符串 (H 對應(yīng) ASCII 72) , 返回值 大于 0int cmp_result_3_1 = strcmp(string_c_comp_3, string_c_comp_1);//輸出字符串對比結(jié)果cout << "cmp_result_1_2 : " << cmp_result_1_2 << " cmp_result_1_3 : " << cmp_result_1_3<< " cmp_result_3_1 : " << cmp_result_3_1<< endl;//C++ 字符串//博客地址 : https://hanshuliang.blog.csdn.net/article/details/99336346// C++ string 類 : 該類定義在 iostream 頭文件中//創(chuàng)建 string 類型對象有三種方法 : //① 直接使用字符串賦值 //② 調(diào)用構(gòu)造方法賦值 //③ 最后可以調(diào)用 new 為字符串分配一塊內(nèi)存//① 使用字符串賦值string string_c_plus_1 = " Hello ";//② 調(diào)用構(gòu)造方法 初始化字符串string string_c_plus_2(string_c_plus_1);string string_c_plus_3(" World ");//上面的三種字符串不需要釋放 , 因為其定義在棧內(nèi)存中 , 下面使用 new 創(chuàng)建字符串的情況需要 delete 釋放內(nèi)存 ; //③ 使用 new 申請的內(nèi)存 , 需要使用 delete 釋放string *string_c_plus_4 = new string(" New ");delete string_c_plus_4;//使用 new [] 申請的數(shù)組 , 需要使用 delete[] 釋放//使用 malloc 申請的內(nèi)存 , 需要使用 free 釋放//C++ 字符串輸出//字符串對象不能直接在 cout 中輸出, cout << string string_c_plus_5 << endl; 是錯誤的//cout << string_c_plus_2 << endl;//要將 string 對象打印到控制臺上, 需要將其轉(zhuǎn)為 C 字符串 , char* 或 char[] 才能輸出cout << string_c_plus_1.c_str() << endl;//C++ 字符串拼接//① "+" : 操作符重載 , 重新定義了 加號運算符的行為 , 這里加號可以實現(xiàn)字符串拼接 , 與 Java 類似//② 調(diào)用 string 對象的 append 方法 , 拼接字符串string string_c_plus_5 = string_c_plus_1 + string_c_plus_3;string string_c_plus_6 = string_c_plus_1.append( string_c_plus_3 );//輸出拼接的字符串cout << string_c_plus_5.c_str() << endl;cout << string_c_plus_6.c_str() << endl;//獲取 C++ 字符串長度 : 調(diào)用 string 對象的 size() 方法 , 獲取字符串長度int string_c_plus_1_size = string_c_plus_1.size();cout << "string_c_plus_1_size : " << string_c_plus_1_size << endl;//判斷 C++ 字符串是否為空 : 調(diào)用 string 對象的 empty() 方法 ; bool string_c_plus_1_empty = string_c_plus_1.empty();cout << "string_c_plus_1_empty : " << string_c_plus_1_empty << endl;//使用 new 創(chuàng)建的對象 , 就不能使用 . 訪問其方法和變量 , 需要使用 -> 符號進(jìn)行訪問 // -> 相當(dāng)于 (*). 運算, 先讀取指針內(nèi)容 , 然后訪問其方法或變量string* string_c_plus_7 = new string(" New String ");//① 獲取字符串長度 : int string_c_plus_7_size = string_c_plus_7->size();cout << "string_c_plus_7 : " << string_c_plus_7_size << endl;//② 判斷字符串是否為空 : bool string_c_plus_7_empty = string_c_plus_7->empty();cout << "string_c_plus_7_empty : " << string_c_plus_7_empty << endl;//釋放堆內(nèi)存delete string_c_plus_7;//使用指針的好處 : // ① 如果在棧內(nèi)存中使用 , 有作用域限制 , 出了棧內(nèi)存 作用域 , 該對象就無效了 ; // ② 指針 大小為 4 ( 32 位系統(tǒng) ) 或 8 ( 64 位系統(tǒng) ) 個字節(jié) , // 其當(dāng)做參數(shù)傳遞 比直接傳遞對象 ( 動輒幾十上百字節(jié)甚至更高 ) 效率更高 //4. 命名空間//博客地址 : https://hanshuliang.blog.csdn.net/article/details/99406975// 命名空間 相當(dāng)于 Java 中的 Package 包 , // 上面的 cout endl string 等都定義在 std 命名空間中// 如果沒有 using namespace std; 聲明命名空間 , // 那么必須使用域作用符 "::" ( 兩個冒號 ) , 否則全都會報錯std::cout << "沒有使用命名空間 需要使用 std::cout << ... << std::endl 打印" << std::endl;//沒有聲明命名空間 : 調(diào)用自定義的 mynamespace 命名空間中的 say_hi 方法 , 必須使用域作用符mynamespace::say_hi();//聲明命名空間 : 如果聲明了 外層的命名空間 , 可以調(diào)用外層命名空間中定義的 say_hi() 方法say_hi();//沒有聲明命名空間 : 嵌套的命名空間調(diào)用 , 需要使用兩個域作用符訪問最內(nèi)層命名空間中定義的方法 mynamespace::myinnernamespace::say_hi_inner(); //只聲明了外層命名空間 , 這里就可以省略上面的外層命名空間 , //但是內(nèi)層的命名空間不能省略 , 因為沒有聲明內(nèi)部命名空間, //需要一個域作用符訪問內(nèi)層命名空間中的方法myinnernamespace::say_hi_inner();//聲明內(nèi)層命名空間 : 如果聲明了 內(nèi)層的命名空間 , 可以調(diào)用內(nèi)層命名空間中定義的 say_hi_inner() 方法say_hi_inner();//域作用符 :: 作用//① 調(diào)用命名空間中的方法 或 變量//② 調(diào)用類中的方法 或 成員變量 , ::變量名稱 可以訪問類中的成員變量//方法中的局部變量int a_int = 999;//域作用符作用std::cout << "類中的成員變量 ::a_int : " << ::a_int << " 方法中的局部變量 a_int : " << a_int << std::endl;//include 與 命名空間 區(qū)別 : // include 的作用 : 將包含的文件 在編譯時 拷貝到 這個文件中 , // 如上面 #include "c_extern.h" , 在編譯時就將 c_extern.h 頭文件中的內(nèi)容 // 全部拷貝到本文件中 使用 #include "c_extern.h" 的位置 //命名空間的作用 : 表明后面所有的代碼都使用這個命名空間 , 如果調(diào)用命名空間中的方法, // 就會去對應(yīng)的命名空間中查找對應(yīng)方法; //函數(shù)完全重復(fù) : 如果 出現(xiàn) 兩個函數(shù) , 其 函數(shù)名 參數(shù)個數(shù) 參數(shù)順序 返回值 完全重復(fù) , 這樣就會造成沖突 //命名空間作用 : 避免 出現(xiàn) 函數(shù)名稱 參數(shù)及參數(shù)順序 , 返回值 完全相同的情況 , 可以將重復(fù)的函數(shù)定義在命名空間中 , 這樣就能區(qū)分兩個完全相同的函數(shù) return 0; }總結(jié)
以上是生活随笔為你收集整理的【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++ 语言】C++字符串 ( str
- 下一篇: 【C++ 语言】Visual Studi