C++面向物件學習筆記(一)
廢話
最近在學C++后臺開發這方面,在看侯捷老師的視頻課,記錄一些學到的新東西,由于筆者有一些C++的基礎,所以一些基礎的知識是不會在這里出現的,侯捷老師的課有講很多關于C++的進階內容,還是很不錯的,就是講話有點慢,得開倍速,有興趣的兄弟們可以去看一看,
正文
1、行內函式
類的成員函式中,有一些可以成為行內函式,同樣的函式體,成為行內函式會比普通函式運行效率更高,只有編譯器能決定函式是否成為行內函式,而作為寫代碼的,有兩種方式建議編譯器把指定函式行內,然而編譯器未必照辦,第一種方法是在類內實作成員函式,也就是函式體寫在類的大括號里面,第二種方法是在函式定義時加一個inline,對于非類成員函式,也可以通過第二種方法變成行內函式,
行內函式說白了就是編譯的時候編譯器會把函式的代碼復制到每一個呼叫函式的地方,這樣相當于省了那一次函式呼叫,會稍微快一點,所以如果你想要行內的函式比較復雜,編譯器大概率會拒絕,一般會把一些小的工具函式宣告為行內函式,
2、建構式初始化運算式
在類的建構式時,如果想要初始化一些類的成員變數,有一種比在函式里賦值更方便的方式,
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) {}
}
如果這里不使用初始化運算式,在子類的建構式執行之前,會先執行父類的默認建構式,使用初始化運算式可以用可以傳參的建構式,如果父類有很多建構式的話,也可以手動指定想要的那一個,
對于不是父類,而是類內復合的其他類(不是用指標參考的成員類),也可以用相同的方式指定復合類的建構式,
3、函式回傳參考
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等,對于指標的操作會操作指向的地址值,
又是一段廢話
好像寫的有點長,寫不完了,明天再寫吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264708.html
標籤:其他
