C++從入門到精通(第一篇) :C++的入門(基礎語法的整理)

      網友投稿 1218 2025-04-02

      一.C++關鍵字(C++98)


      C++總計63個關鍵字,C語言32個關鍵字

      這里不做具體的講解,只是了解下就可以了

      二.命名空間

      在C/C++中,變量、函數和后面要學到的類都是大量存在的,這些變量、函數和類的名稱將都存在于全局作

      用域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字

      污染,namespace關鍵字的出現就是針對這種問題的。

      解決命名沖突的問題

      命名空間定義

      定義命名空間,需要使用到namespace關鍵字,

      后面跟命名空間的名字,然后接一對{}即可,{}中即為命名空間的成員。

      //1. 普通的命名空間 namespace N1 // N1為命名空間的名稱 { // 命名空間中的內容,既可以定義變量,也可以定義函數 int a; int Add(int left, int right) { return left + right; } } //2. 命名空間可以嵌套 namespace N2 { int a; int b; int Add(int left, int right) { return left + right; } namespace N3 { int c; int d; int Sub(int left, int right) { return left - right; } } } //3. 同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中。 namespace N1 { int Mul(int left, int right) { return left * right; } }

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

      命名空間使用

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

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

      int main() { printf("%d\n", N::a); return 0; }

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

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

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

      using namespce N; int main() { printf("%d\n", N::a); printf("%d\n", b); Add(10, 20); return 0; }

      三.C++輸入&輸出

      #include using namespace std; int main() { cout<<"Hello world!!!"<

      說明:

      使用cout標準輸出(控制臺)和cin標準輸入(鍵盤)時,必須包含< iostream >頭文件以及std標準命名空 間。 注意:早期標準庫將所有功能在全局域中實現,聲明在.h后綴的頭文件中,使用時只需包含對應頭文件

      即可,后來將其實現在std命名空間下,為了和C頭文件區分,也為了正確使用命名空間,規定C++頭文 件不帶.h;舊編譯器(vc

      6.0)中還支持格式,后續編譯器已不支持,因此推薦使用 +std的方式。

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

      #include using namespace std; int main() { int a; double b; char c; cin>>a; cin>>b>>c; cout<

      注:但是對于有特別的格式要求的輸出,如輸出小數點后幾位則建議使用printf(cout會非常的麻煩)

      四: 缺省參數

      概念:

      缺省參數是聲明或定義函數時為函數的參數指定一個默認值

      在調用該函數時,如果沒有指定實參則采用該默認值,否則使用指定的實參

      例:

      void test(int a = 0) { cout << a << endl; } int main() { test();// 沒有傳參時,使用參數的默認值 test(1);// 傳參時,使用指定的實參 return 0; }

      缺省參數分類

      1. 全缺省參數

      void TestFunc(int a = 10, int b = 20, int c = 30) { cout<<"a = "<

      六:引用

      概念

      引用不是新定義一個變量,而是給已存在變量取了一個別名,編譯器不會為引用變量開辟內存空間,它和它

      引用的變量共用同一塊內存空間。

      類型& 引用變量名(對象名) = 引用實體;

      void TestRef() { int a = 10; int& ra = a;//<====定義引用類型 printf("%p\n", &a); printf("%p\n", &ra); }

      注意:引用類型必須和引用實體是同種類型的

      引用特性

      引用在定義時必須初始化

      一個變量可以有多個引用

      引用一旦引用一個實體,再不能引用其他實體

      引用和指針的區別

      在語法概念上引用就是一個別名,沒有獨立空間,和其引用實體共用同一塊空間。

      int main() { int a = 10; int& ra = a; cout<<"&a = "<<&a<C++從入門到精通(第一篇) :C++的入門(基礎語法的整理)

      引用和指針的不同點:

      引用在定義時必須初始化,指針沒有要求

      引用在初始化時引用一個實體后,就不能再引用其他實體,而指針可以在任何時候指向任何一個同類型

      實體

      沒有NULL引用,但有NULL指針

      在sizeof中含義不同:引用結果為引用類型的大小,但指針始終是地址空間所占字節個數(32位平臺下占

      4個字節)

      引用自加即引用的實體增加1,指針自加即指針向后偏移一個類型的大小

      有多級指針,但是沒有多級引用

      訪問實體方式不同,指針需要顯式解引用,引用編譯器自己處理

      引用比指針使用起來相對更安全

      內聯函數

      概念

      以inline修飾的函數叫做內聯函數,編譯時C++編譯器會在***調用內聯函數的地方展開***,沒有函數壓棧的開銷,

      內聯函數提升程序運行的效率。

      特性

      inline是一種以空間換時間的做法,省去調用函數額開銷。所以代碼很長或者有循環/遞歸的函數不適宜 使用作為內聯函數。

      inline對于編譯器而言只是一個建議,編譯器會自動優化,如果定義為inline的函數體內有循環/遞歸等 等,編譯器優化時會忽略掉內聯。

      inline不建議聲明和定義分離,分離會導致鏈接錯誤。因為inline被展開,就沒有函數地址了,鏈接就會 找不到。

      // F.h #include using namespace std; inline void f(int i); // F.cpp #include "F.h" void f(int i) { cout << i << endl; } // main.cpp #include "F.h" int main() { f(10); return 0; } // 鏈接錯誤:main.obj : error LNK2019: 無法解析的外部符號 "void __cdecl f(int)" (? //f@@YAXH@Z),該符號在函數 _main 中被引用

      auto關鍵字(C++11)

      C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的類型

      指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。

      int TestAuto() { return 10; } int main() { int a = 10; auto b = a; auto c = 'a'; auto d = TestAuto(); cout << typeid(b).name() << endl; cout << typeid(c).name() << endl; cout << typeid(d).name() << endl; //auto e; 無法通過編譯,使用auto定義變量時必須對其進行初始化 return 0; }

      注意

      使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類

      型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為

      變量實際的類型。

      九:基于范圍的for循環(C++11)

      范圍for的語法

      在C++98中如果要遍歷一個數組,可以按照以下方式進行:

      void TestFor() { int array[] = { 1, 2, 3, 4, 5 }; for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i) array[i] *= 2; for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p) cout << *p << endl; } void TestFor() { int array[] = { 1, 2, 3, 4, 5 }; for(auto& e : array) e *= 2; for(auto e : array) cout << e << " "; return 0; } void TestFor(int array[]) { for(auto& e : array) cout<< e <

      對于一個有范圍的集合而言,由程序員來說明循環的范圍是多余的,有時候還會容易犯錯誤。因此C++11中

      引入了基于范圍的for循環。for循環后的括號由冒號“ :”分為兩部分:

      第一部分是范圍內用于迭代的變量,

      第二部分則表示被迭代的范圍

      void TestFor() { int array[] = { 1, 2, 3, 4, 5 }; for(auto& e : array) e *= 2; for(auto e : array) cout << e << " "; return 0; }

      十:指針空值nullptr(C++11)

      在良好的C/C++編程習慣中,聲明一個變量時最好給該變量一個合適的初始值,否則可能會出現不可預料的

      錯誤,比如未初始化的指針。如果一個指針沒有合法的指向,我們基本都是按照如下方式對其進行初始化:

      void TestPtr() { int* p1 = NULL; int* p2 = 0; // …… }

      NULL實際是一個宏,在傳統的C頭文件(stddef.h)中,可以看到如下代碼:

      #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif

      可以看到,NULL可能被定義為字面常量0,或者被定義為無類型指針(void*)的常量。不論采取何種定義,在

      使用空值的指針時,都不可避免的會遇到一些麻煩,比如:

      void f(int) { cout<<"f(int)"<

      程序本意是想通過f(NULL)調用指針版本的f(int*)函數,但是由于NULL被定義成0,因此與程序的初衷相悖。

      在C++98中,字面常量0既可以是一個整形數字,也可以是無類型的指針(void*)常量,但是編譯器默認情況下

      將其看成是一個整形常量,如果要將其按照指針方式來使用,必須對其進行強轉(void *)0。

      注意:

      1. 在使用nullptr表示指針空值時,不需要包含頭文件,因為nullptr是C++11作為新關鍵字引入的。

      2. 在C++11中,sizeof(nullptr) 與 sizeof((void)0)所占的字節數相同。

      3. 為了提高代碼的健壯性,在后續表示指針空值時建議最好使用nullptr。*

      總結

      本章講的知識之所以比較雜和亂,是因為我們要先打好基礎,為了下一章的***類和對象***

      感覺不錯的話,關注本博主!我會慢慢帶你學習C++的

      C++ Linux

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:裁剪Excel插入的圖片
      下一篇:怎么通過關鍵字查找詳細內容?(如何快速查找關鍵字)
      相關文章
      亚洲日韩VA无码中文字幕| 亚洲国产成人精品无码区在线网站| 亚洲国产高清在线| 亚洲精品色午夜无码专区日韩| 亚洲人成网站观看在线播放| 免费亚洲视频在线观看| 狼人大香伊蕉国产WWW亚洲| 亚洲国产午夜精品理论片在线播放| 亚洲AV成人影视在线观看| 亚洲av专区无码观看精品天堂| 91亚洲精品自在在线观看| 亚洲伦理一二三四| 亚洲AV色吊丝无码| 亚洲中文字幕无码爆乳app| 亚洲一区二区三区乱码在线欧洲| 亚洲娇小性色xxxx| 亚洲区日韩精品中文字幕| 亚洲区日韩精品中文字幕| 亚洲国产精品无码久久| 色九月亚洲综合网| 亚洲国产成人精品无码久久久久久综合| 亚洲精品乱码久久久久久蜜桃| 亚洲VA综合VA国产产VA中| 国产亚洲精品资在线| 久久夜色精品国产亚洲AV动态图| 亚洲第一福利网站| 亚洲男人的天堂在线| 亚洲免费在线视频观看| 亚洲性色精品一区二区在线| 国产精品手机在线亚洲| 国产亚洲美女精品久久久| 亚洲不卡中文字幕无码| 亚洲人成在线影院| 亚洲乱码无限2021芒果| 亚洲精品9999久久久久无码| 亚洲AV无码不卡在线观看下载| 亚洲综合熟女久久久30p| 无码欧精品亚洲日韩一区| 亚洲欧洲日产国码www| 中文字幕亚洲精品无码| 国产精品亚洲а∨无码播放麻豆|