C++面向對象學習筆記(一)

C++面向對象學習筆記(一)

廢話

最近在學C++後臺開發這方面,在看侯捷老師的視頻課,記錄一些學到的新東西。因爲筆者有一些C++的基礎,因此一些基礎的知識是不會在這裏出現的。侯捷老師的課有講不少關於C++的進階內容,仍是很不錯的,就是講話有點慢,得開倍速。有興趣的兄弟們能夠去看一看。c++

正文

一、內聯函數函數

類的成員函數中,有一些能夠成爲內聯函數。一樣的函數體,成爲內聯函數會比普通函數運行效率更高。只有編譯器能決定函數是否成爲內聯函數,而做爲寫代碼的,有兩種方式建議編譯器把指定函數內聯,然而編譯器未必照辦。第一種方法是在類內實現成員函數,也就是函數體寫在類的大括號裏面。第二種方法是在函數定義時加一個inline。對於非類成員函數,也能夠經過第二種方法變成內聯函數。工具

內聯函數說白了就是編譯的時候編譯器會把函數的代碼複製到每個調用函數的地方,這樣至關於省了那一次函數調用,會稍微快一點。因此若是你想要內聯的函數比較複雜,編譯器大機率會拒絕。通常會把一些小的工具函數聲明爲內聯函數。學習

二、構造函數初始化表達式指針

在類的構造函數時,若是想要初始化一些類的成員變量,有一種比在函數裏賦值更方便的方式。code

class someClass
{
public:
    // 構造函數
	someClass(int i) : someVariable(i) {}
private:
	int someVariable;
}

這樣不只是看起來比較明顯,並且在執行時會減小一步賦值。正常寫法的話,執行時會先給someVariable賦初始值(這裏沒有,就是0),而後再把傳進來的參數i賦值給它。利用初始化表達式,會直接將someVariable的初始化用i的值來進行,少了一步賦值。視頻

類似的狀況還有在調用一些有參數的構造函數時發生。(這裏也能夠認爲是調用了someVariable的一個有參數的構造函數。)對象

class father
{
public:
    // 默認構造函數
    father()
    // 另外一個構造函數
    fatehr(int i) {}
}

class someClass : public father
{
public:
	someFunction(int i) : father(i) {}
}

若是這裏不使用初始化表達式,在子類的構造函數執行以前,會先執行父類的默認構造函數。使用初始化表達式能夠用能夠傳參的構造函數,若是父類有不少構造函數的話,也能夠手動指定想要的那一個。開發

對於不是父類,而是類內複合的其餘類(不是用指針引用的成員類),也能夠用相同的方式指定複合類的構造函數。編譯器

三、函數返回引用

C++中函數能夠返回引用,這裏指的不是返回指針。先給例子。

int &AddOne(int &i){
    ++i;
    return &i;
}
int AnotherAddOne(int i){
    ++i;
    return i;
}
//這是錯的!
int &WrongAddOne(int i){
    ++i;
    return &i;
}

不管是返回引用仍是參數爲引用,其本質都是傳入和返回一個地址。使用地址的好處就是能夠省下一個局部變量的建立。好比在上例第一個函數中,與第二個函數相比,傳入和返回時各省下了一個臨時變量。而在第三個函數中,i是一個函數內部的局部變量,存在棧上,當函數返回後該區域就屬於未知領域了,因此在返回以後仍使用i的地址跟用野指針是一個性質。(雖然有時候這麼寫能夠跑出對的結果,可是要避免!)

再補充一下,引用和指針的區別。一言以蔽之,引用就是一個指針常量。同一個變量的引用和指針的值都是它的地址值,是同樣的。引用的特色在於它必須依賴於變量而存在,所以它永遠不會是空。對於引用的全部操做會自動施加在原變量上,好比自增,sizeof等。對於指針的操做會操做指向的地址值。

又是一段廢話

好像寫的有點長,寫不完了。明天再寫吧。

相關文章
相關標籤/搜索