第一周筆記
一C++編程簡(jiǎn)介
基于對(duì)象Object Based:對(duì)單一class的設(shè)計(jì),
面向?qū)ο驩bejct Oriented:面對(duì)的是多重classes的設(shè)計(jì),classes和classes之間的關(guān)系
STL是Standard Template Library的簡(jiǎn)稱(標(biāo)準(zhǔn)模板庫(kù))
Struct與class的區(qū)別欢搜?
最本質(zhì)的區(qū)別就是默認(rèn)的訪問(wèn)控制。struct作為數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)體,它默認(rèn)的數(shù)據(jù)訪問(wèn)控制是public的鹏氧,而class作為對(duì)象的實(shí)現(xiàn)體,它默認(rèn)的成員變量訪問(wèn)控制是private的佩谣。
#include<cstdio>與#include<stdio.h>的區(qū)別??
加C頭文件是C++為了兼容純C語(yǔ)法而對(duì).h文件進(jìn)行了處理把还,例如cstdio
寫.h文件時(shí) 通常會(huì)加上防衛(wèi)式聲明
在include一個(gè)文件時(shí),若程序中include了當(dāng)前程序中已經(jīng)include了的文件,則不會(huì)有重復(fù)的include含入動(dòng)作(最好任何頭文件都要加防衛(wèi)式的聲明)
把t指定為double和int
(本體內(nèi)定義的就是inline function)不在本體內(nèi)定義的加inline
復(fù)雜的沒(méi)法內(nèi)聯(lián)如何理解吊履?
可消除所有與調(diào)用相關(guān)的痕跡以及性能的損失安皱。inline通過(guò)消除調(diào)用開(kāi)銷來(lái)提升性能。
內(nèi)聯(lián)函數(shù)與宏函數(shù)的區(qū)別
(1)內(nèi)聯(lián)函數(shù)同宏函數(shù)一樣將在被調(diào)用處進(jìn)行代碼展開(kāi)艇炎,省去了參數(shù)壓棧酌伊、棧幀開(kāi)辟與回收,結(jié)果返回等缀踪,從而提高程序運(yùn)行速度居砖。
(2)內(nèi)聯(lián)函數(shù)相比宏函數(shù)來(lái)說(shuō),在代碼展開(kāi)時(shí)辜贵,會(huì)做安全檢查或自動(dòng)類型轉(zhuǎn)換(同普通函數(shù))悯蝉,而宏定義則不會(huì)。
inline函數(shù)的缺點(diǎn)總結(jié)如下:?
(1)代碼膨脹托慨。
inline函數(shù)帶來(lái)的運(yùn)行效率是典型的以空間換時(shí)間的做法鼻由。內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),消除函數(shù)調(diào)用帶來(lái)的開(kāi)銷厚棵。如果執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間抵拘,相比于函數(shù)調(diào)用的開(kāi)銷較大侨糟,那么效率的收獲會(huì)很少拨拓。另一方面苏遥,每一處內(nèi)聯(lián)函數(shù)的調(diào)用都要復(fù)制代碼,將使程序的總代碼量增大彬犯,消耗更多的內(nèi)存空間向楼。
(2)inline函數(shù)無(wú)法隨著函數(shù)庫(kù)升級(jí)而升級(jí)。
如果f是函數(shù)庫(kù)中的一個(gè)inline函數(shù)谐区,使用它的用戶會(huì)將f函數(shù)實(shí)體編譯到他們的程序中湖蜕。一旦函數(shù)庫(kù)實(shí)現(xiàn)者改變f,所有用到f的程序都必須重新編譯宋列。如果f是non-inline的昭抒,用戶程序只需重新連接即可。如果函數(shù)庫(kù)采用的是動(dòng)態(tài)連接炼杖,那這一升級(jí)的f函數(shù)可以不知不覺(jué)的被程序使用灭返。
(3)是否內(nèi)聯(lián),程序員不可控坤邪。
inline函數(shù)只是對(duì)編譯器的建議熙含,是否對(duì)函數(shù)內(nèi)聯(lián),決定權(quán)在于編譯器罩扇。編譯器認(rèn)為調(diào)用某函數(shù)的開(kāi)銷相對(duì)該函數(shù)本身的開(kāi)銷而言微不足道或者不足以為之承擔(dān)代碼膨脹的后果則沒(méi)必要內(nèi)聯(lián)該函數(shù)婆芦,若函數(shù)出現(xiàn)遞歸怕磨,有些編譯器則不支持將其內(nèi)聯(lián)喂饥。
(比較推薦的寫法是把一個(gè)經(jīng)常要用的而且實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單的小型函數(shù)放到類里去定義消约,大型函數(shù)最好還是放到類外定義。)
Public:
Private:一般哪些放入private(不打算被外界調(diào)用的)
(第三種员帮?)protectd
外部如何得到private數(shù)據(jù)或粮?
public中讀取
設(shè)定讀寫!!!
構(gòu)造函數(shù):構(gòu)造函數(shù)與類名相同;沒(méi)有指明參數(shù)用默認(rèn)值,沒(méi)有返回類型(不需要)
用來(lái)創(chuàng)建對(duì)象
(相比起來(lái)效率低)
變量數(shù)值設(shè)定分兩階段:初始化捞高,賦值(assign)
用動(dòng)態(tài)方式創(chuàng)建氯材,得到指針
析構(gòu)函數(shù)?硝岗?,不帶指針的類多半不用析構(gòu)函數(shù)
構(gòu)造函數(shù)可以有很多歌重載overloading(常常發(fā)生在構(gòu)造函數(shù))
同名函數(shù)可以有多個(gè)
8uHG氢哮?
這里不行
因?yàn)檫@里調(diào)用complex的話1和2沖突
把構(gòu)造函數(shù)放進(jìn)private(有這種需求)
設(shè)計(jì)模式--singleton(單例)
設(shè)計(jì)接口指的是?
不加const的后果:
如果被調(diào)用處沒(méi)有加const 使用時(shí)加了const
Reference(引用)最好所有參數(shù)都pass by reference而不是pass by value
希望傳了引用而不能改內(nèi)容時(shí) 加一個(gè)const
c++比其他面向?qū)ο笮室咝吞矗@部分也是講提高效率
返回值的傳遞也盡量 by reference
什么情況不return by reference冗尤?
Friend打破了封裝
通過(guò)函數(shù)拿數(shù)據(jù)效率比f(wàn)riend拿數(shù)據(jù)效率慢
編寫class注意三點(diǎn)(以高效率為標(biāo)準(zhǔn))
數(shù)據(jù) 一定放在private里面
參數(shù)盡可能pass by reference(加不加const看狀況)
盡量renturn by reference
在類的本體里的函數(shù),能加const的就加
構(gòu)造函數(shù) 盡量用初值列
關(guān)于::
??1)global scope(全局作用域符)胀溺,用法(::name)
2)class scope(類作用域符)裂七,用法(class::name)
3)namespace scope(命名空間作用域符),用法(namespace::name)
c++語(yǔ)言中建議使用引用類型的形參代替指針仓坞?背零? ?詳見(jiàn)p190 ?
操作符重載與臨時(shí)對(duì)象 ?(下列代碼,皆是class body外的)
操作符重載實(shí)質(zhì)上是函數(shù)重載
(用reference的好處)
這里complex&接收无埃,return *ths傳出怎么理解徙瓶?? ?????????????
按照c的特性嫉称,基本操作符可以做上圖中從右到左的賦值
如果而這里設(shè)計(jì)成void 侦镇,c3+=c2+=c1不能通過(guò)
小結(jié):當(dāng)使用者連串使用重載運(yùn)算符時(shí)應(yīng)注意重載操作符函數(shù)的定義
返回的是臨時(shí)對(duì)象,則不能return by reference
黃色部分創(chuàng)建的就是臨時(shí)對(duì)象
設(shè)計(jì)函數(shù)時(shí)兩種思想
設(shè)計(jì)成成員函數(shù)
設(shè)計(jì)成全局函數(shù)(前面沒(méi)有類的名稱)
如果使用時(shí)連串輸出澎埠,則不能定義成void ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????