? ? ? ? 大家好啊。最近學習了一點關于c++的知識。這不就迫不及待的來與大家分享了嘛。但我這也是現學現賣所以咧。有很多遺落甚至不對的地方希望大家可以在評論區里面指出來。這樣也可以增加大家對知識的鞏固。
c語言與c++的聯系
? ? ? ? 不知道大家看到c++會不會不由自主的聯想到C語言啊。畢竟都是編程語言而且都帶有一個c那么聯想到應該很正常吧。反正開始的時候我身邊的人是這樣的。每當有人說著c++。哦,那個人不是學c語言的嘛。應該會吧。但是我開始對c++一點都不知道啊。但是經過今天的學習。我知道了。c++與c語言確實有很大的聯系。
? ? ? ?更加準確的說C++是在C語言的基礎上發展而來的,它是完全兼容C語言的。大家還記得我們以前在vs里面創建項目的時候后綴打的是.c。當然寫c++的代碼vs還是適用的。只是后面我們創建c++項目的時候用的是.cpp了。
? ?? ?還有就是我們也可以在.cpp里面寫c語言的代碼。但是不能再.c里面寫c++的代碼。因為c++是在c語言的基礎上延伸發展的。也可以說c++是以c語言為基礎而衍生出來的更加先進的編程語言。?好了大家只是需要知道c++是以c語言為基礎發展的并且c++包含c語言就可以了。
第一個代碼
? ? ? ? 不知道大家是否還記得剛開始玩c語言的時候寫的第一個代碼是什么了。但是我覺得我當時寫的第一個代碼是關于printf的。然后對于c++的話我們這里也是實現關于printf的。大家可以看一下:
? ? ? ?大家發現了吧。這個代碼實現的效果與c語言中的printf是一樣的。并且除了前期準備啊。代碼量還像也差不多的。但是其中還有一些什么東西不理解啊。比如說什么std啊cout啊還有什么endl啊。大家別急。接下來我們就一一來講解。
命名空間
? ? ? ?對于c++的第一個正式知識點我們來講講命名空間namespace那命名空間的含義是啥咧。這個我們先來看看比較官方的解釋是個啥:在C/C++中,變量,函數和后?要學到的類都是?量存在的,這些變量、函數和類的名稱將都存在于全局作?域中,可能會導致很多沖突。使?命名空間的?的是對標識符的名稱進?本地化,以避免命名沖突或名字污染,namespace關鍵字的出現就是針對這種問題的。
? ? ? ?也就是說命名空間就是為了解決我們c語言中的名字重復。避免沖突。那么光講的話也不能讓大家理解,那么我們直接舉個例子:
? ? ? ? 大家看一下上面的兩個區別。一個報錯一個成功打印了。大家還記得rand的作用吧。rand是生成一個隨機數的。反正這也就表明嘛。這是庫函數,在c語言中如果出現這樣的話就不能實現效果,但是在c++里面我們只需要命名一下空間那么就變的合理了。這下子大家知道namespace的作用了吧。
? ? ? ? 并且大家也看到了namespace的用法就是namespace+名字。然后{}。在括號里面可以寫可以定義變量/函數/類型等。就是說出來上面這個以外還可以定義一個變量以外還可以定義結構體,函數這些。
? ? ? ? ?只要定義好了之后就可以正常使用了。?并且還可以嵌套命名空間就是一個命名空間里面還可以寫其他的命名空間。
? ? ? ? 大家應該發現了吧。我在使用命名空間的時候再打印的時候是寫的yh::rand。這就是使用命名空間的最基本的指定命名空間訪問,大家可以理解為yh->rand。這是我們后面使用最常見且為最穩妥的一個用法了。還有一個用法就是using將命名空間中某個成員展開。什么意思咧。以上面這張圖片來說就是將命名空間中的其中一些指定的成員,比如說經常使用的,免得每次都要指定。那么具體是什么樣子的咧:
? ? ? ?這里我們只放開了yh空間中的a。所以我們在使用的時候,只有a可以不在特定的引用了。其他的還是需要特定引用。?那既然有指定開,或者或是半開,那么有沒有全開咧。嘿,可還真有。展開命名空間中全部成員 。含義顯而易見吧,就是把整個 命名空間全部展開。這樣就不需要大家特定指引了。但是這雖然看起來要號一些。但是項?不推薦,沖突?險很?。因為你本來就是為了防止命名沖突的,你這又全部展開了。豈不是沒干了。但我們寫代碼較少的話也可以用,畢竟少嘛。風險也較小。但后面上班了。寫項目了還是盡量或者別用:
? ? ? 大家也看到這里就了解了命名空間如何創建以及命名空間的三種用法了吧。
輸入與輸出
? ? ? ?當我們學習了namespace后,我們就來聊聊代碼中的第二個新知識點cout。大家可以稍微看一下下面的解釋。
? ? ? ?我們前面說過c++是c語言的發展。那么接下里我們要講一個爽點。我們都還記得我們c語言輸入與輸出變量的話都需要確定我們輸入與輸出的類型。但是大家看我的那個代碼,輸出的時候我并沒用寫類型啊。是不是,這就是c++與c語言相比的一個爽點。
還有就是大家可以在io需求?較?的地?,如部分?量輸?的競賽題中,加上以下3?代碼可以提?C++IO效率 。ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);反正就是沒寫對我們現在是無差的。但是寫了還是有意的。我們只管寫進可以了。
缺省參數
? ? ? ? 什么叫缺省參數啊。沒怎么聽過啊。那么缺省參數就是聲明或定義函數時為函數的參數指定?個缺省值。在調?該函數時,如果沒有指定實參 則采?該形參的缺省值,否則使?指定的實參,缺省參數分為全缺省和半缺省參數。(有些地?把缺省參數也叫默認參數)
? ? ? ?并且在c++中缺省參數分為半缺與全缺。名字顯而易見,全缺就是沒有指定實參。半缺就是有一部分確定了實參。
? ? ? ?C++規定半缺省參數必須從右往左依次連續缺省,不能間隔跳躍給缺省值。帶缺省參數的函數調?,C++規定必須從左到右依次給實參,不能跳躍給實參。函數聲明和定義分離時,缺省參數不能在函數聲明和定義中同時出現,規定必須函數聲明給缺省值。
? ? ? ?就是說缺省參數定義的話只能從右向左缺。就是右邊開始沒有。調用的話就是翻過來的。然后聲明必須確定缺省值。那么上面是什么意思咧。我們來講講。
? ? ? ? 我們可以看看我們上面寫的這個代碼。第一個Func我們就沒傳參數啊。我在引用的時候寫了a與b的值。這就是我們在沒有傳參的時候使用默認的參數。并且這個還是一個全缺省參數。怎么看的咧。什么看我們在引用的時候是不是直接都賦了值的。也就是說就算我們在調用的時候沒有傳參,c++還是加油用默認參數給出一個答案。
? ? ? ? ?接下來就是半缺,我們講過,我們在寫的時候從右向左。調用的時候從左向右。我們如果是半缺的話就不能像全缺那樣,一個都不寫。比如說:
? ? ? ? 我們可以看到半缺的時候我們如果一個沒寫,系統是會提醒的。這就表明我們半缺你要保證我們使用的式子每一個都有參數。那個缺了就補那個。并且不能跳躍。這也是系統不允許的。我們至少要保證完成這個樣子。?
? ? ? ? 對于缺省參數我們還有一個知識點就是缺省參數不能聲明和定義同時給。什么意思咧。大家看一下下面的這個照片就知道了?。
總結
? ? ? 好的,上面就是c++的初階學習的上篇了,然后我們接下來還會有一個下篇。這里我們主要先交代一些讓大家消化一下,畢竟剛從c語言轉到c++的話,可能還會有一點不理解,所以先給大家一點時間看一下,消化一下。這里只是開胃菜,然后大家還是需要把這些記住,因為后面對于c加加的學習和使用的話會用的比較多。?