關(guān)于類與C++
?????? C++中的類與C語言中的struct(結(jié)構(gòu)體)類似,所不同的是struct中的數(shù)據(jù)為public類型;
關(guān)于數(shù)據(jù)與函數(shù)
?????? C語言中使用函數(shù)(function)處理數(shù)據(jù)(data),在C++中,將數(shù)據(jù)和處理它們的函數(shù)放在一起,也就是放在類中
基于對象(Object Based)和面向?qū)ο螅∣bject Oriented)
Object Based:面對的是單一Class的設(shè)計;
Object Oriented:面對的是多重Classes的設(shè)計,注重類與類之間的關(guān)系
頭文件的防衛(wèi)式聲明(guard)
防衛(wèi)式聲明可以避免重復(fù)聲明(declaration)和定義(definition)。
類的聲明
由class head和class body組成;
class body中的數(shù)據(jù)和函數(shù)有public、private、protected三種類型;
其中,public對外可見;private對外不可見,對內(nèi)可見。
“operator +=”是什么?
即“運(yùn)算符重載”
對于我們聲明的complex(復(fù)數(shù))類,我們想讓它可以做數(shù)學(xué)上的加減乘除運(yùn)算,然而C++并未內(nèi)置和復(fù)數(shù)有關(guān)的運(yùn)算符,只有能夠操作整數(shù)和浮點(diǎn)數(shù)的+、-、*、/、++、--,以及賦值運(yùn)算符+=、-=、*=、/=。如果我們聲明了兩個complex的對象c1和c2,分別對應(yīng)復(fù)數(shù)(1,1)和(2,2),想要實(shí)現(xiàn)(1+1i)+(2+2i)=(3+3i)的效果,就必須對“+”這個運(yùn)算符進(jìn)行重載。
例如:
這個例子中,分別對“復(fù)數(shù)+復(fù)數(shù)”、“復(fù)數(shù)+double”、“double+復(fù)數(shù)”三種情況,對加號運(yùn)算符進(jìn)行了重載。
另外,__doapl函數(shù)是“do assignment plus”的意思,即賦值加法(+=)。
為何聲明為“friend”(友元)?
由于類的封裝性,類外部的函數(shù)是無法訪問到類內(nèi)的private成員的。但是也會有在類外使用類內(nèi)成員變量的可能性,如果再把這些成員變量定義為public,又破壞了類的封裝性。
因此要解決這種問題,就有了friend友元的方案。友元可以自由訪問對應(yīng)的類中的數(shù)據(jù),而不受private的限制。
友元函數(shù)的定義在類外,但是聲明時在類內(nèi),并在前面加上“friend”關(guān)鍵字。
同時可以這樣理解:同一個類的各個成員之間互為friend。
何時pass by value(傳值)?何時pass by reference(傳引用)?
對于函數(shù)傳參的場景,value和reference該如何取舍呢?
對于引用,可以理解為編譯器在編譯階段將引用翻譯為指針來處理,因此引用通常只占用4個字節(jié),對于要傳遞的參數(shù)大小超過4個字節(jié)的情況,傳引用將會提高效率。
關(guān)于返回值傳遞引用return by reference
傳遞者無需知道接收者是否是以reference(引用)形式接收的。
很多情況下返回值應(yīng)該盡量傳遞引用,但是對于以下三個函數(shù):
返回一個引用是不恰當(dāng)?shù)?。這是因?yàn)樵谶@些函數(shù)里面,返回值是一個臨時對象temp object,它在函數(shù)體外將被銷毀,傳遞一個被銷毀對象的引用將會導(dǎo)致未定義行為(undefined behavior)。
關(guān)于構(gòu)造函數(shù)(constructor)
?● 構(gòu)造函數(shù)是在類的對象的初始化時被調(diào)用,通常用來對成員變量進(jìn)行賦值。
?● 構(gòu)造函數(shù)可以有默認(rèn)參數(shù),如果調(diào)用時未指定參數(shù),那么構(gòu)造函數(shù)將根據(jù)默認(rèn)參數(shù)來初始化成員變量。默認(rèn)參數(shù)如下圖:
?●?構(gòu)造函數(shù)可以有重載。重載的定義為:
在相同的聲明域中,函數(shù)名相同,而參數(shù)表不同。通過函數(shù)的參數(shù)表而唯一標(biāo)識并且來區(qū)分函數(shù)的一種特殊的函數(shù)用法。
參數(shù)表的不同表現(xiàn)為:
1、參數(shù)類型不同;
2、參數(shù)個數(shù)不同;
因此對于下面這兩個函數(shù),是會出現(xiàn)重定義錯誤的:
● 構(gòu)造函數(shù)可以放在private里面,是單例模式(Singleton)的寫法,保證了一個類在系統(tǒng)中只能有一個實(shí)例。
關(guān)于聲明為const的成員函數(shù)
成員函數(shù)可以聲明為const,如圖:
即保證該成員函數(shù)不會改變?nèi)魏纬蓡T變量。雖然有些時候,這個const看起來并不是必需的,但對于下列情況:
const complex c1(2, 1);
cout << c1.real();
cout << c1.imag();
假如real()和imag()并沒有const標(biāo)示,那么這段代碼就會出錯。這是因?yàn)椋?/p>
const對象只能調(diào)用const成員函數(shù);
而非const對象可以調(diào)用const成員函數(shù)或非const成員函數(shù);