今天開起c++大門,c++對c語言的許多缺陷進行了改進,但是總是會存在一些未知的問題,等著我們共同努力去發現解決。c++是乙個不斷發展改進的過程,它的魅力也是居高不下。在排行榜中基本緊跟老大哥c語言的步伐。哈哈
今天來說說c++一些基礎共有十一大部分
之所以要引進命名空間就是因為當乙個專案有很多原始檔一起執行時會產生命名衝突的問題。所以每個原始檔都可以定義自己的命名空間,然後在自己命名空間中定義成員變數和成員函式,就不會產生重定義的問題。就好比在我們這個地球村有許多和我們重名的人,那我們怎麼區分呢?對了就是進行劃分區域再劃分,分治的思想哈哈。可以吧乙個專案比作地球,重定義的成員就像我們名字一樣的人,命名空間就像這些國家,省市一樣。1.來說說命名空間的定義:
分為3種:①普通命名空間 ②巢狀命名空間(就像省裡面巢狀市一樣) ③同乙個檔案中可以定義多個相同的命名空間,但編譯器會把他們合成乙個
①:假如命名空間中的成員被偶爾用到時就可以這樣使用 命名空間名稱::成員②:如果命名空間中的某個成員被多次用到那就可以使用這一條語句 using 命名空間名::成員,後面使用就不用了特意說明,直接使用,此時該成員就像乙個檔案的全域性變數,缺點:可能會和其它成員衝突
③:如果命名空間的多個成員被多次使用,可以這樣使用:using namespace 命名空間名; 就像經常用的using namespace std;它的成員會被全部展開,相當於全域性變數,衝突率就更高了
要說c++的輸入輸出之前先來說說c語言的輸入輸出scanf這個函式在對其變數賦值時必須對其取位址,如果不取位址,不會在編譯時崩潰,它在程式執行時崩潰,這一點真的很可惡哈哈(不取位址,vs編譯器就會預設拿第乙個位址來賦值,那是不可訪問的當然崩潰),再來說說printf這個函式,它不會對引數進行匹配性檢測printf("%d,%lf\n", 10, "hehe");顯然這是不合理的,另外c的輸入輸出語句格式需要記得很準,不然呵呵。
基於以上這樣所以c++引入cin和cout 它使用簡單,不用考慮格式並且支援連續的輸入輸出。
另外c語言函式:①若無函式返回型別時,它會預設為整形。②函式沒有引數時,在傳參依舊會壓棧只是不會用罷了。c++都改進了這種缺陷。
①:什麼是預設引數呢?全省引數就是宣告或定義函式時為函式的引數設定乙個預設值,當進行函式呼叫時如果不傳參就會使用這個預設值,有點像備胎的意思哈。說完預設引數的概念來說說它的分類
②:預設引數的分類:它分為①:全預設引數②半預設引數
其中全預設引數就是函式的所有引數就會設定乙個預設值,版預設就是函式的引數只有一部分有預設值。
注意:1.半預設的函式的引數預設值只能從右往左給,不能間隔這給。必須連續
2.全省引數只能在函式定義或宣告給乙個,不能兩個同時給。(如果都設定,編譯器不知道用哪個)一般給在宣告。why?一般函式定義會包含在檔案中可能不會看見它的實現自然也就不知道它有沒有預設引數並且是什麼。
3.預設引數的賦予:1.可以是乙個常量2.可以用全域性變數來提供。但是不能賦表示式,因為值不確定。
4.c語言不支援預設引數的設定
1.概念:就是多個函式擁有同乙個函式名但實現不同的功能,過載的函式引數列表必須不同2.條件:要想構成函式過載就必須滿足這幾種條件①:同乙個作用域(都是全域性作用域或命名空間)。②:函式名相同。
③:引數列表不同指的是引數的型別不同或者引數個數不同或者引數型別的順序不同
3.原因:之所以c++中能存在函式過載,是因為編譯器在編譯期間會對函式的引數型別進行推演,並根據推演結果來決定呼叫哪乙個函式。如果沒有合適的型別匹配的過載函式就可能會產生兩種做法:①:嘗試進行隱式型別轉換--直接呼叫 ②:編譯失敗:存在兩種級以上轉換方式。
注意:①:全預設和無參的過載函式最好不要同時存在,當呼叫函式不給引數時會產生兩種呼叫的方式,出錯。
②:c語言不支援函式過載,因為名字修飾規則不同。
③:僅僅函式返回值不同不會構成函式過載,因為呼叫時可能會不唯一。vs把返回值型別也加進去在此不是很科學。
如果我們再乙個c++程式中需要執行一部分c語言程式那該怎麼辦呢?這是extern就上場了,只需要在所需要執行的c語言程式前加上extern "c"就可以了
1.現在來說說引用的概念:引用就是給乙個變數取乙個別名,編譯器不會為引用變數開闢記憶體,它和引用的變數共用一塊記憶體區域(定義概念上)2.如何定義格式?引用變數的型別後面緊跟& 接著引用變數的名字 = 引用的變數
3.引用的性質:①:引用在定義時必須初始化
②:乙個實體可以有多個引用
③:乙個引用變數和實體結合後,就不能和其他實體結合。
④:引用型別必須和實體型別相同
注意:實體的生命週期一般比引用周期長
4.const型別的引用
①引數列表:能傳遞引用盡量傳遞引用
②引數按照引用的方式:傳引數---傳值一樣 函式體中對形參的操作與傳值格式可以達到與指標型別的效果
1.const引用
double c = 16.6; const int& rc = c; 此時rc不再是c的引用,而是將c的整數部分拿出來重新找一塊空間放進去,用ra來指向它,由於這是編譯器自己做的,此刻該塊空間就存著乙個臨時變數,我們又無法得知該空間的位址,又無法得知它的名字。具有常性所以它無法改變,所以加const。
在c++中,const型別的引用---萬能引用(既可以引用普通型別的變數也可以引用常量)
5.引用的應用:
①.函式的引數:如果需要通過形參改變外部的實參---普通型別
如果不需要通過形參改變外部的實參---const型別的引用
②:返回值:返回實體的宣告週期比函式的宣告周期長
注意:不能返回棧上的空間
6.引數型別:
先來說說函式呼叫傳值和傳址的優缺點
①傳值:優點:不會通過函式形參來改變實參 缺點:不能改變實參,傳參開銷大
傳值:優點:傳參開銷小,並且可以通過形參來改變實參。 缺點:容易忽略指標判空,格式較為複雜(第一次接觸指標總想去掉*哈哈)
③:在底層:
編譯器在底層將引用按照指標的方式來進行處理的,引用實際就是指標。
t& ===> t* const (指向變數的內容可改,指向的變數不能改)
const t& ===> const t* const (所指變數和其內容都不能改)
在底層,引用變數實際是有空間的。
7.棧幀與棧有什麼區別?
①: 棧幀是利用棧的特性的一塊記憶體空間。棧則是一種特殊的資料結構
②:呼叫約定(_cdecl):就是約定傳參的順序以及傳參機制,傳參壓棧方式和函式接收引數進棧方式
8.指標和引用有什麼區別?
①:引用在定義時要初始化,指標可以不用。
②:沒有空引用但有空指標
③:乙個引用只能引用乙個實體,而指標可以指向其他
④:有多級指標但沒有多級引用
⑥:引用加1是實體加1,指標加1是記憶體區域往後移動乙個
⑦:訪問實體方式不同:指標顯示解引用,引用編譯器自己處理
⑧:引用比指標用起來更安全
1.inline修飾的函式就是內聯函式2.內聯函式處理:在編譯器編譯階段,用函式體替換函式呼叫的位置,少了函式呼叫引數壓棧以及棧幀建立的時間開銷,提高了**的執行效率
3.注意:①加inline不一定當內聯函式來處理,沒有迴圈,遞迴,才可能當成內聯函式來處理(不同編譯器處理不同)
②使用內聯函式不能使宣告和定義分開,否則會產生鏈結錯誤
4.對比巨集與const
①:const修飾的常量,具有巨集常量替換的特性
②:巨集替換發生在預處理階段,const修飾的變數替換發生在編譯階段
巨集函式:
①:優點:①提高**執行效率--在預處理階段:用巨集函式體替換呼叫位置,沒有函式呼叫開銷
②:缺點:①在預處理階段進行替換,不會進行引數型別檢測
②**的復用性不好,**膨脹。
③無法除錯
④有***(括號嚴格使用,最好所有變數都加括號,每一部分也要加括號。即便如此也可能會有***就是遇到類似(++b這種,一旦巨集中替換後有多個就會導致b被多次計算)
內聯函式:①在編譯階段進行替換,會進行引數型別檢測
②無巨集的***
1.概念:現今:根據賦值的型別來判斷變數的型別(型別佔位符)由於這個特性必須初始化早期:在c中auto修飾的變數,是具有自動儲存器的區域性變數
2.使用規則:
①:auto 宣告指標型別加不加*都一樣
②:auto 宣告引用則一定要&
③:宣告多個變數型別必須一樣
④:不能作為函式引數(帶預設值也不行)
⑤:不能推演陣列
3.優點:簡化**
1.出現原因:for對於乙個確定陣列範圍,還要給定顯得多餘,還容易出錯2.條件:①範圍必須確定
②迭代物件實現++或==操作
3.注意:範圍for注意是將陣列元素拷貝到臨時變數e中
1.原因:由於null是乙個巨集,定義為整數0,或者被定義為無型別指標(void*)的常量,可能會遇到不必要的麻煩珍&原始碼2.nullptr代表乙個指標空值常量。
3.nullptr的型別為nullptr_t
4.注意:①使用nullptr不用包含標頭檔案,c++將其引為關鍵字
②:sizeof(nullptr) 與 sizeof((void*)0)所佔的位元組數相同
③:為了提高**的健壯性,在表示指標空值時最好使用nullptr。
初夏小談 類和物件(一)
所以在c 中把處理問題的步驟進行包裝就形成了類。這個類可以處理特定的問題,而不用去關注它是怎麼一步步處理的。在c 中類用class來標識,struct也可以。類中不僅可以定義變數,還可以定義函式。例如 struct student void printstu 成員變數 char name 20 ch...
初夏小談 AI雲盤系統
解決由於經常將一些以前的檔案刪除,而現今或者以後可能用到的尷尬境地。ai雲盤系統功能具體可分為兩大塊 分別是客戶端和服務端兩大部分。客戶端與服務端通訊的協議是基於http協議。客戶端 1.首先獲取檔案的備份資訊記錄,目的是看看哪些檔案已經進行了備份,並將這些檔案的大小和修改資訊以鍵值對的形式儲存到u...
初夏小談 複雜鍊錶的複製
在鍊錶的中有這樣一類鍊錶。它至少包含兩個指標。其中乙個指向下乙個結點。有乙個指標隨機的指向鍊錶的其它結點,也可能指向它自己,也可能指向null。對於該類鍊錶的複製來說。最大的難度就是如何處理複製的新鍊錶的這個隨機指標指向的問題。因此在對該類煉表處理時,就必須根據源鍊錶的指標指向來得到新鍊錶的隨機指標...