C++面向對象高級開發1


1.C++編程簡介

推薦書籍

  • 《C++ Primer第五版》
  • 《Effective C++》
  • 《C++標准庫》
  • 《STL源碼剖析》

2.頭文件與類的聲明

Classes根據是否擁有pointer members分成兩類,其中string的對象是一個指針,指向一個字符串。
1635584002879

自己聲明的頭文件用"",標准庫頭文件用<>
1635584023294

C++和C簡單程序的不同寫法:

Header頭文件的防衛式聲明:#ifndef __COMPLEX__用來判斷是否定義過 complex.h頭文件,如果沒有定義過則用#define __COMPLEX__定義, #endif表示判斷結束。
1635584062937

頭文件的布局與聲明:
1635584086939

1635584163186

類模板用於對象需要不同類型的參數的時候,其中類里面形參和實參都要寫成T,對象聲明時要加上參數的類型:
1635584192412

3.構造函數

inline可以讓程序執行變快,函數在本體內定義,就自動成為inline,如果在外面定義就不是inline,但可以加上inline聲明他是inline,但到底是不是inline是由編譯器決定的,如果函數太復雜就不會是inline。

1635584225511

在類中,數據都應該被定義成私有的(private),私有變量不可以被對象取出,除非變量是共有的(public)。private和public可以交叉着寫,不用寫完全部的public再寫private。

1635584597678

構造函數可以指定默認參數,同時切記構造函數前面沒有返回值類型,下圖中是構造函數的特殊語法用來初始化,如果將參數放到括號里面就是變量初始化后的賦值階段了,效率會低。

不帶指針的類多半不用寫析構。

重載通常和構造函數一起使用,在函數編譯后,函數名字其實是不同的。函數有了默認值,也可以去寫重載函數,但是對於圖中右邊的c1和c2,使用左邊的1和2都是可以的,所以對於圖中情況不行。

4.參數傳遞與返回值

構造函數放在private里以后就不能在類外創建對象,但是這種寫法通常用在單例模式Singleton中:

1635768746536 1635768770396

函數右邊加上const說明對函數的操作並不會改變數據,於是這樣不會改變數據的函數通常會在函數名右邊加上const。

對象定義時前面加上const說明對象是不可以被改變的,如果函數不寫const,就存在可能會更改對象的可能性(更改的話會報錯),這樣就和對象的定義矛盾,因此寫上const更為周全。

1635769205075

傳引用相當於傳指針,大多數情況下希冀傳參是引用,如果不希望傳入參數被修改,就在類型后面加上&:

1635769474343

返回值和返回引用相比,盡量返回引用,同樣在類型后面加上&:

1635769561597

通過聲明友元可以獲得類中private變量的值,但是這樣的話會打破面向對象的封裝性,其實也可以不寫友元,通過函數來獲取到,但是由於使用了函數效率會變低。

1635769866058

同一class定義出來的各個對象之間互為友元:

1635769900445

在下面圖片中,ths指針指向的的re和im會被改變,而r的re和im不會被改變,所以傳入的r引用前加了const。如果__doapl函數內寫的是c = ths->re + r.re;,那么就不能再傳引用作為返回值,因為在函數結束后,c會被銷毀。

1635770261151

5.操作符重載與臨時對象

重載的實現有兩種方式,可以寫成成員函數和非成員函數。實際上所有的成員函數都自帶了一個隱藏的this指針,這個指針指向調用者,誰調用我我就指向誰:

1635853268352

下圖中,引用用在傳遞函數參數和返回值的時候,左圖中的ths,傳進來的是一個指針,返回的是指針所指向的值,傳遞者無需知道接收者以何種方式接收

重載函數的返回值類型需要是complex而不能是void,因為在左邊的連串賦值中,c2加完c1之和還需要傳給c3加

1635853405872

下圖中的非成員函數重載寫出了三種不同情況下的函數,對應右邊的加法。其中,非成員函數中沒有this指針

非成員函數重載的返回值不能是引用,因為加法運算完成以后必須創建出來一個local object來接收,如果傳引用,對象離開這個函數就死掉了,所以要利用返回

1635853880080

下圖中,typename()表示創建臨時對象,不需要給對象以名稱,臨時對象的生命在下一行代碼就結束,右邊三個對象也是臨時對象。

1635854189314

下圖中的取反功能兩個函數,-函數中因為創建了一個新空間存放臨時對象,所以必須返回值;而上邊的+ 函數什么事情都沒做,所以即可以返回引用,也可以返回值。

1635854539731

下圖中<<函數把右邊輸出到左邊cout身上,所以不能寫成一個成員函數,只能寫全局的

cout的類型是ostream,可以傳引用,但是不能加const,如果加了const表示ostream在函數里面不能改變,其實ostream在每一次輸出時候都在被修改

cout << c1 << conj(c1);是一個連串的輸出,接收c1以后還要接收conj(c1),所以返回類型是ostream,如果只有一個<<,返回類型可以實void

1635854772204

6.總結

  1. 構造函數的初始化寫法;
  2. 函數該不該寫const
  3. past by refrence 還是 past by value
  4. 數據應該是private,而函數應該是public的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM