【GeekBand】Week01-類的簡介

關(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ù);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,533評論 1 51
  • C++基礎(chǔ)2:類與對象 1. 認(rèn)識類與對象 什么是類(class)?類(class)是類型(type),是用戶自定...
    jdzhangxin閱讀 2,323評論 0 7
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束,并將收入和稅金輸出到文件tax. out。 檢查...
    SeanC52111閱讀 2,841評論 0 3
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,276評論 9 118
  • 有一種蟲子困惑了我差不多四十年。四十年來,從小學(xué)到高中,從大學(xué)到知天命,我查閱了大量資料始終查不到它的學(xué)名,只好還...
    雨燕江南閱讀 2,867評論 1 14