• <span id="qootd"></span>
      1. <track id="qootd"></track><acronym id="qootd"></acronym>

        類、實例和對象類是從C語言中的結構體演變而來,結構體的成員變量也就演化成類的成員變量,這時類只能存放數據。為了在類內部操縱這些數據,增加了成員函數的功能。所謂成員函數就是在類的內部定義,用來操作類的成員變量的函數。隨后對成員變量和成員函數附上“私有”、“保護”和“公共”的訪問權限,于是“類”便大致成型。事實上,C++中結構體的功能大致和類相當,也有了成員函數。“成員”是成員變量和成員函數的統稱。

        類的出現帶動設計風格的巨大變化,與傳統設計方法相區別,稱之為“面向對象設計”。

        “類”和結構體一樣,是一種自定義的數據類型,但不是基本類型。“實例”是用自己定義的“類”這個數據類型來定義的變量。這些一個一個的實例統稱“對象”。另外,“繼承”和“派生”是同一件事的不同說法,B類繼承了A類,也就是說A類派生了B類。
        class 類名 {              //|    class CSample {
        訪問符:                   //|    public:
            成員變量定義;         //|        int x1;
            成員函數定義;         //|        CSample();
        訪問符:                   //|    protected:
            成員變量定義;         //|        int a;
            成員函數定義;         //|        float sum(float f1, float f2);
        訪問符:                   //|    private:
            成員變量定義;         //|        int m;
            成員函數定義;         //|        double sum(double f1, double f2);
        ......                    //|    ......
        }                         //|    }
        一般按習慣將private:定義部分放在緊靠類名下面,并且“private:”可以省略。“private:”下面定義的成員全是“私有”的,也就是只能在這個類的成員函數里可以使用,外部(包括派生的子類)不能使用。“public:”下面定義的成員,所有地方都能使用。“protected:”下面定義的成員,在派生的子類中則相當于“public”,其它地方則相當于“private”。

        構造函數和析構函數

        “構造函數”是類產生實例時被調用,進行初始化設置,是一個特殊的成員函數,函數名與類名相同,沒有返回值。一般構造函數定義在“public:”下面,但有時為了阻止多個實例的產生而特意定義在“private:”或“protected:”下面。當初始化時沒有什么需要設定時也可以不定義,編譯時會自動生成一個默認的構造函數。構造函數的重載使得實例的生成靈活而且方便,默認的構造函數沒有參數,且是定義在“public:”下面的。

        “析構函數”是類的實例被銷毀時調用,進行最后的處理,例如釋放動態分配的內存等。一般析構函數定義在“public:”下面,不需要時也可以不定義,編譯時會自動生成一個默認的析構函數。析構函數的函數名與類名相同,前面有“~”返回值。

        下面的例子演示構造函數和析構函數被調用的順序。

        1. #include <iostream>
        2. using namespace std;
        3.  
        4. class CA {
        5. int a;
        6. public:
        7. CA(){
        8. a = 0;
        9. cout << "構造函數: " << a << endl;
        10. }
        11. ~CA(){
        12. cout << "析構函數: " << a << endl;
        13. }
        14. void setA(int x) {
        15. a = x;
        16. }
        17. void print() {
        18. cout << "print: " << a << endl;
        19. }
        20. };
        21.  
        22. int main ( )
        23. {
        24. CA ca;
        25. //ca.a = 10; //成員變量a是私有的,不能直接訪問
        26. ca.setA(10);
        27. ca.print();
        28.  
        29. return 0;
        30. }

        運行結果:
        構造函數:0
        print:10
        析構函數:10

        成員函數的定義和聲明分開

        上面例子是將成員函數的定義和聲明全寫在類的定義體里面,更好的編程風格是分開來寫,也就是類定義體里面只寫成員變量和成員函數的聲明,而成員函數的定義則寫在類的定義體外。這樣,類的定義體就可以移到“頭文件”中去。在外部定義時,成員函數名前面要加上“類名::”。

        1. //==test.h==
        2. class CA {
        3. void a;
        4. public:
        5. CA();
        6. ~CA();
        7. void setA(int x);
        8. void print();
        9. };
        10.  
        11. //==test.cpp==
        12. #include <iostream>
        13. #include "test.h";
        14. using namespace std;
        15.  
        16. CA::CA(){
        17. a = 0;
        18. cout << "構造函數: " << a << endl;
        19. }
        20. CA::~CA(){
        21. cout << "析構函數: " << a << endl;
        22. }
        23. void CA::setA(int x) {
        24. a = x;
        25. }
        26. void CA::print() {
        27. cout << "print: " << a << endl;
        28. }
        29.  
        30. int main ( )
        31. {
        32. CA ca;
        33. //ca.a = 10; //成員變量a是私有的,不能直接訪問
        34. ca.setA(10);
        35. ca.print();
        36.  
        37. return 0;
        38. }

        運行結果:
        構造函數:0
        print:10
        析構函數:10

        生成實例的3種方法

        了解生成實例的三種方法的細微區別是很重要的:

        • 申明為變量;
        • 從無名對象復制;
        • 申明為指針并動態生成。


        注意:指針的成員用“->”,而不用“.”。

        1. #include <iostream>
        2. #include <string>
        3. using namespace std;
        4.  
        5. int main ( )
        6. {
        7.     string strA("C語言中文網");  //直接調用構造函數生成實例
        8.     cout << strA << "    " << strA.length() << endl;
        9.  
        10.     string strB;  //先調用構造函數生成空字符串實例
        11.     strB = string("C++60分鐘入門教程");  //再調用構造函數生成無名實例,然后復制給strB實例,無名實例立即銷毀
        12.     cout << strB << "    " << strB.length() << endl;  //這和上面①的方法的結果相同
        13.  
        14.     string *strC;  //先定義一個指針,尚未分配空間
        15.     //動態調用構造函數生成實例后,再將實例地址賦給指針變量
        16.     strC = new string("http://see.xidian.edu.cn/cpp/biancheng/cpp/jichu/");
        17.     cout << *strC << "    " << strC->length() << endl;
        18.     delete strC;              //千萬不要忘記釋放
        19.  
        20.     return 0;
        21. }

        運行結果:
        C語言中文網    11
        C++60分鐘入門教程    17
        http://see.xidian.edu.cn/cpp/biancheng/cpp/jichu/    49

        免責聲明:本文僅代表作者個人觀點,著作權歸作者所有。其原創性以及文中陳述文字和內容(包括圖片、視頻、附件等)未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請用戶僅作參考,并請自行核實相關內容。轉載作品務請注明出處,機構云平臺、個人云空間的建設權、管理權、所有權均歸實名機構和實名師生所有,與世界大學城無關。
        標簽:C++類與對象
        還能輸入 2000 個html字符
        色偷偷