在完成了C++面向?qū)ο蟾呒壘幊蹋ㄉ希┑谝恢艿膶W(xué)習(xí)之后帐我,有一些總結(jié)和心得在這里通過學(xué)習(xí)筆記的方式分享出來,供也在學(xué)習(xí)C++的小伙伴們用作學(xué)習(xí)交流,如有理解不到位的地方,歡迎批評指正。
一.C++與C的區(qū)別
C++是在C的基礎(chǔ)之上進(jìn)化而來的美尸,因此C++優(yōu)化了C的一些不足。
在C語言中,處理數(shù)據(jù)的函數(shù)和數(shù)據(jù)是分開的胖眷,而由于C語言中沒有提供關(guān)鍵字榕栏,所以這些數(shù)據(jù)一定是全局的;因此這樣一來胯陋,每個(gè)函數(shù)都可以處理這些數(shù)據(jù)蕊温;
而在C++中,有了class這個(gè)關(guān)鍵字遏乔,它能夠把數(shù)據(jù)和需要處理這些數(shù)據(jù)的函數(shù)們都放在了一個(gè)class中义矛,這樣一來就不會(huì)讓外界隨便的去使用這些數(shù)據(jù);換句話說盟萨,這樣就有很好的封裝性凉翻。如下圖所示:
并且,C++分為Object Based(基于對象)和Object Oriented(面向?qū)ο螅┠砑ぃ琌bject Based面對的是單一class設(shè)計(jì)制轰,Object Oriented面對的是多重classes設(shè)計(jì)前计。
二.C++代碼基本形式
C++跟C語言一樣,也具有一定的格式:
1.Header頭文件
首先是頭文件的guard(防衛(wèi)式聲明)垃杖,頭文件的防衛(wèi)式聲明非常重要男杈。
因?yàn)镃++是面向?qū)ο蟮恼Z言,C++代碼需要處理類的多重設(shè)計(jì)调俘,因此就需要考慮類和類之間的關(guān)系伶棒。#include指令是編譯預(yù)處理,在一個(gè)程序的開頭脉漏,我們要把標(biāo)準(zhǔn)庫的頭文件和自己寫的一些頭文件通過編譯預(yù)處理放在開頭苞冯。如果沒有進(jìn)行防衛(wèi)式聲明,在頭文件和源文件中重復(fù)定義的變量編譯是無法通過的侧巨。
Header頭文件的布局:前置聲明舅锄、類的聲明、類的定義
對于class的聲明司忱,分為class head和class body皇忿,有些函數(shù)在class body中直接定義,另一些則在body之外定義坦仍。
2.Inline(內(nèi)聯(lián))函數(shù)
函數(shù)若在class body內(nèi)定義完成鳍烁,便自動(dòng)成為inline候選人。這里繁扎,我認(rèn)為我們在寫函數(shù)時(shí)幔荒,都可以寫inline,因?yàn)榫幾g器會(huì)自動(dòng)識(shí)別能不能成為inline函數(shù)梳玫,不能也不會(huì)有壞的結(jié)果爹梁,inline函數(shù)可以提高程序的運(yùn)行效率。
另外提澎,寫在public中的一般是函數(shù)姚垃,可以被外界調(diào)用;而寫在private中的一般是數(shù)據(jù)盼忌,將數(shù)據(jù)部分封裝起來积糯,不可隨意被外界調(diào)用,這也就是C++優(yōu)于C的地方谦纱。在寫代碼時(shí)看成,Public和private可以任意交錯(cuò)。
3.Constructor(ctor跨嘉,構(gòu)造函數(shù))
在構(gòu)造函數(shù)中可以設(shè)置參數(shù)的初始值绍昂,即默認(rèn)實(shí)參(下圖實(shí)例中默認(rèn)值為0)。初值列(初始列)是構(gòu)造函數(shù)的特有寫法,也可用傳統(tǒng)賦值語句代替窘游。
構(gòu)造函數(shù)可以有很多個(gè)overloading(重載):
上面的例子中唠椭,雖然函數(shù)名稱是一樣的,但在編譯器看來卻是不一樣的忍饰。但是下面這種重載就是行不通的贪嫂,因?yàn)閯?chuàng)建無參對象時(shí),這兩個(gè)函數(shù)都是默認(rèn)把參數(shù)設(shè)置為0艾蓝,因此這兩個(gè)函數(shù)都是可行的力崇,這時(shí)編譯器就不知道該去調(diào)用哪個(gè)函數(shù)。
4.Const?member function(常量成員函數(shù))
該函數(shù)的操作不改變數(shù)據(jù)內(nèi)容赢织。注意:為了避免引起錯(cuò)誤亮靴,只要確定不會(huì)引起數(shù)據(jù)內(nèi)容改變的函數(shù)最好都寫成常量成員函數(shù)的形式。
5.參數(shù)/返回值傳遞:pass by value vs. pass by reference (to const)
傳遞一個(gè)引用的效率更高于置,但是在有些情況下茧吊,不得不去傳值。如果一個(gè)變量是在函數(shù)中所定義的八毯,并且我們也需要這個(gè)變量搓侄,而這時(shí)去返回這個(gè)變量的引用是不行的。因?yàn)楹瘮?shù)一結(jié)束话速,這個(gè)局部變量就自動(dòng)被銷毀了讶踪,傳引用就沒有了意義,這時(shí)就只能夠傳值泊交;相反乳讥,如果我們需要的這個(gè)變量的空間一直存在,那么就可以考慮用傳引用來提高效率廓俭。
6.Friend(友元)
使用友元云石,便可自由取得private中的內(nèi)容,相同class的各個(gè)object互為友元白指。
7.Operator
overloading(操作重載符-1,成員函數(shù))this
所有的成員函數(shù)一定帶著隱藏的this指針酵紫,通常告嘲,誰調(diào)用這個(gè)函數(shù),誰就是this奖地;this是一個(gè)特殊的指針橄唬,編譯器自動(dòng)把調(diào)用者的指針傳給this。
8.Class body之外的各種定義
a.操作符重載-2参歹,非成員函數(shù)仰楚,無this
為了應(yīng)對多種可能用法,開發(fā)多個(gè)函數(shù),可以創(chuàng)建臨時(shí)對象僧界,則直接在類的名稱后()侨嘀,括號(hào)中寫處理方法。
b.在函數(shù)中新創(chuàng)建的local object不能pass by reference
C.C++自定義類型的一些operator是可以被重載的捂襟,比如+咬腕,+=,++
d.下面的例子若沒有返回值葬荷,一次只調(diào)用一次運(yùn)算是可以的涨共,但是,連串輸出則會(huì)受限制宠漩。