最近開始看侯捷老師的C++視頻:面向對象高級開發,邊看邊記錄自己理解的知識點。
目前看了P1-P6,其實如果之前有C++的基礎,而且看過一兩本C++方面的書籍,前面幾節還是看的很快的,我平均是按照1.25的倍速看的(侯老師的語速很慢,每個知識點將的都很清楚)。
總體來說前6節課就是重點在講如何正規的寫C++代碼,按照侯老師的說法是培養正規的、大氣的編程習慣,一出手就能不同凡響。那該如何寫出正規的大氣的C++的代碼呢?前幾節侯老師一直強調的大概就是以下幾點了。
1、儘量使用成員初始化列表對類的成員進行初始化
什麼是成員初始化列表?我們來看看《Essential C++》中給的用法。(P106)
Memeber initialization list(成員初始化列表)緊接在參數列表最後的冒號後面,是個以逗號分隔的列表。其中欲賦值給member的數值被放在member名稱後面的小括號中。
成員初始化列表
class complex
{
complex(double r=0,double i=0)
:re(r),im(i)
{}
private:
double re,im;
}
在構造函數內部賦值
class complex
{
complex(double r=0,double i=0)
{
re=r;
im=i;
}
private:
double re,im;
}
2、成員變量設置爲private
這個是爲了體現C++類的封裝性。
3、傳遞時儘量用引用傳遞(pass by reference),不要用值傳遞(pass by value)
這個很好理解,當我們要傳遞的對象內容很多時,傳引用要比傳值快很多,因爲傳值需要重新賦值一遍。傳引用只是把地址傳遞過去。具體引用傳遞怎麼用就不寫啦,網上這方面的文章提多的。
4、函數該不該加const要格外注意
class complex
{
complex(double r=0,double i=0)
:re(r),im(i)
{}
double real() const { return re;} //函數名後有const,表示不改變數據內容
double imag() {return im;} //imag()後面沒有const修飾。
private:
double re,im;
}
void main()
{
const complex c(2,1);
cout<<c.real()<<endl; //正常
cout<<c.imag()<<endl; //編譯器提示錯誤
}
我們先定義了一個常量對象,然後用對象調用成員函數,測試發現加了const修飾的成員函數real()可以正常調用,不加const修飾的imag()函數調用失敗,why?因爲我們的對象是個常量,不能改變數據,但是imag()沒有被const修飾,修改器認爲這個函數可能會改變數據,所以是矛盾的。
5、return的時候是return by value還是 return by reference
函數return結果的時候,要看返回的對象是在函數內部臨時建立的,還是通過引用傳遞過來的,如果是臨時建立的就要用return by value。
return by value
int plus(const int x,const int y)
{
return x+y;
}
return by reference
int & plus(const int &x,const y)
{
x+=y;
return x;
}
總之前幾節的收穫就是我們要以正規的、大氣的方式的寫C++代碼。