1. 程式人生 > >c++類和類的封裝,物件執行緒封裝

c++類和類的封裝,物件執行緒封裝

1. C++面向物件程式設計介紹

面向物件程式設計(Object Oriented Programming),簡稱OOP

傳統的面向過程程式設計中,資料以及資料的相關操作函式都是分離的獨立個體

物件,如周圍的一切其實都是物件;就程式設計角度,物件包括A)一系列屬性(資料);B)一系列操作(函式)。

OOP提供了設計物件的功能,物件包括特性和行為,兩者都囊括在一起,共同構成物件實體(即類實體)

物件實體,使程式更模組化更易讀易寫,提升了程式碼重用到一個更高的層次;

物件提供了對資料操作的直接方法,定義了如何與物件進行互動,以及物件之間的互動

更重要的是,OOP提供了更實用的概念:封裝、繼承、多型和抽象

這篇主要講述封裝,即物件將資料及其操作函式封裝到一個類實體中。

2. 類和類成員

C++提供瞭如char、int、long、float、double等基本資料型別,足夠用來解決大多數哦相對簡單的問題,但對於複雜的問題就比較困難了。

C++的一個實用特性是自定義資料型別;如之前的列舉和結構體:


列舉和結構體代表了傳統的面向過程程式設計,它們只包含資料,如果需要訪問此型別變數,必須提供自定義函式,並以該型別變數為引數:


在OOP世界中,我們希望自己的型別不僅包括資料,也包括操作資料的函式;C++中,通過class關鍵字來宣告一個類。

2)類類似結構體,但它更多功能和更靈活:


類似結構體,類的宣告沒有分配記憶體,只是說明了類的結構;類的宣告以分號結尾

為了使用類,可以宣告一個該型別的變數:


宣告一個類的變數,也叫例項化一個類;該變數稱作為類的一個例項,或者物件。

3)成員函式:

類不僅僅包含資料(成員變數),亦可以包含函式,稱作成員函式


成員函式可以類似訪問成員變數,使用'.'來使用:


通常,類的成員變數,加一個字首'm_'來區分:

3. 公有和私有

1)訪問識別符號:公有-public關鍵字,私有-private關鍵字

在上面的DateStruct的結構體,它的成員可以在main函式中訪問,因為結構體的所有成員預設是公有的

,即public;

公有成員在結構體和類中,程式的任何函式都可以訪問;

但如果Date的成員沒有public識別符號,則會出現錯誤:



這個說明,類成員的預設是私有的,即private的;

私有的成員只能在類的定義之內的函式可以訪問

可以通過public關鍵字使成員變為公有的,即可訪問了:


類和結構體的本質區別之一是類的成員可以使用識別符號來控制它們的可訪問性;

C++提供了3種不同的訪問識別符號:public、private、protect,分別是公有的、私有的和保護的:


4. 訪問函式和封裝

1)訪問函式,也叫做讀寫函式;是讀取和寫入私有成員變數的值。

例如:


GetLength函式就是個訪問函式。

訪問函式有2種,即getter和setter:


將資料成員私有化,提供Getter和Setter來訪問,即所謂的"封裝" ;

2)封裝

封裝的思想就是將實現的細節隱藏,而暴露公有介面;

C++中的訪問識別符號,可以實現在類中的封裝;通常是將所有的成員變數私有化;

儘管看起來訪問成員變數的不直接,但使程式更有可重用性和可維護性;

A)封裝實現,無論類的實現如何改變,只要對外的介面不發生變化即可。


如圖上例,如果m_Value被重新命名了,那麼main函式中訪問就會出錯;

如果提供了m_Value的訪問函式:


B)隱藏了類的實現,類的使用者只需知道公共的介面,就可以使用該類;

C)封裝幫助防止意外的改變和誤用;

D)對程式除錯有很大的幫助,因為改變類的成員變數只用通過公共介面。

5. 建構函式Ⅰ

1)建構函式:是類的一種特殊的成員函式,當類被例項化時執行;通常用以初始化成員變數。

建構函式有明確的命名規則:A)函式名必須和類名一樣;B)無返回型別(包括void)。

無參建構函式-不帶引數的建構函式,是類的預設建構函式:


通常,類都包含一個預設的建構函式,可以初始化成員變數。

含參建構函式-含有引數的建構函式,可以對成員變數賦予指定的值;


以上的兩個建構函式,類似過載函式;建構函式必須有唯一的前面(引數個數和引數型別)。

類亦可以只提供含參建構函式,沒有預設建構函式:



6. 解構函式

解構函式是類的另一種特殊的函式,當類的物件銷燬時呼叫;它和建構函式是成對出現的。

普通的簡單類,一般不需要解構函式;因為C++會自動回收垃圾;

如果類中執行了某些動態記憶體分配,則需要顯式定義解構函式,並釋放回收垃圾;

解構函式的明確命名規則:A)函式名和類名一樣,並字首'~';B)不能帶引數(即意味著只有一個解構函式);C)沒有返回型別。



注意動態分配,必須提供解構函式,來回收分配的空間。

2)建構函式和解構函式的時序:


如上圖所示,輸出的依次是:simple的建構函式,pSimple的建構函式,最後是pSimple的解構函式。

建構函式和解構函式的時序是:Constructor First, Destructor Last。

7. 隱藏的'this'指標

如之前的例子中的this,是每個類的成員函式隱藏的指標,它指向了類成員函式打交道的類的物件。

實用性:

1)當建構函式或成員函式中的引數名和成員變數名相同時,可以使用this來訪問本類的成員變數;

2)可以使用this返回類的物件引用:


8. 建構函式Ⅱ

1)私有建構函式-如果不想類以外使用指定的建構函式,我們可以將它私有化。


類只能被例項化一次,稱作為單一性;通常使用私有/保護建構函式進行的。

2)建構函式鏈和初始化

有時,一個建構函式所做的工作和另外的建構函式一樣,只是增加了一些;

這樣這個建構函式可以呼叫另外的建構函式,稱作為建構函式鏈。如C#就支援這種格式,但C++不支援。

但建構函式可以呼叫類中的非建構函式,只是要注意這些非建構函式呼叫的成員,必須已經初始化。

通常的做法就是,定義一個公共的非建構函式,建構函式都呼叫它來初始化共同的;例如:


9. 類程式碼和標頭檔案

1)在類的定義之外定義成員函式。

如之前的類定義,都是在類的定義中定義成員函式:


當類的定義越來越長和越來越複雜時,就顯得臃腫,難以維護和操作;

幸運的是,C++提供了一種分離類的定義及其應用定義的方法,將類的成員函式在類的外面定義;格式是:類名::函式名


2)將類的定義放在標頭檔案中:

標頭檔案的使用可達到重用的效果;所以將類的定義放在標頭檔案中,而成員函式放在.cpp中定義;而cpp的名字需和類的名字相同。

Date.h:


Date.cpp:


推薦分離類的定義中的成員函式到類外定義。

10. 常量類物件和成員函式

函式的引數可以為常量物件,如內建的基本資料型別一樣,類物件也可以宣告為常量,所有常量物件的變數必須在建立時初始化,其後不能修改。



上圖3個錯誤,因為程式試圖修改常量類物件的變數;


因為常量類物件不能呼叫非常量成員函式;

常量成員函式-保證不修改任何類變數或呼叫任何非常量函式。

為了使GetValue常量化,可以在其原型加個const關鍵字:


注意:

A) 常量成員函式在類外定義時,也必須加const關鍵字;

B) 任何常量成員函式試圖修改類成員變數,或者呼叫非常量成員函式都是非法的,會產生編譯錯誤。

C)建構函式不能常量化;

過載函式使用const和非const,是當返回型別不一樣的時候。

11. 靜態成員變數

在之前的程式中,靜態表示變數的值在執行期間保持最新的值;

1)靜態成員變數

在例項化兩個物件,其包含的相同的成員變數;

靜態成員變數是屬於類的本身,是所有物件的共享變數;它的值是保持修改的最新值;

使用格式:類名::靜態成員。

2)靜態成員變數的初始化

初始化必須在類的程式碼檔案中進行。

12. 靜態成員函式

如靜態成員變數一樣,靜態成員函式是屬於類的本身,不屬於任何類的物件;

如靜態成員變數訪問一樣,可以通過:類名::靜態成員來訪問類的靜態成員變數。

注意:靜態成員函式,沒有this指標;

例如:


13. 友元類和友元函式

多數時候,類和函式需要執行很緊密;但需使用顯示函式來列印相關資訊,這並不顯得很隱藏類的細節;

這時,友元類很友元函式就很好的訪問私有細節;

1)友元函式

友元函式訪問類的私有成員,就如其是類的一個成員函式。

一個友元函式可以是,也可以不是其他類的成員函式;使用關鍵字friend。

例如:


一個友元函式可以是多個類的友元函式;

2)友元類

友元類是,宣告在其他類中,可以訪問其他類的私有變數;


在使用友元函式和友元類時,請務必謹慎。

14. 匿名變數和物件

所謂匿名,就是可以不通過命名變數來訪問,減少臨時變數。

【免責特此宣告:
1)本內容可能是來自網際網路的,或經過本人整理的,僅僅代表了網際網路和個人的意見和看法!
2)本內容僅僅提供參考,任何參考該內容造成任何的後果,均與原創作者和本部落格作者無關!】

C++學習:類,物件,封裝

  1. 物件
  2. 封裝

    C++是一門集面向過程,面向物件以及泛型程式設計於一體的強大的程式語言,在這裡面最重要的要屬面向物件了吧???什麼是面向物件?面向物件的思想是什麼???總結下來就一句話:萬物皆物件.在面向物件的世界裡,一切都是可以用物件來解釋的.這也是面向物件思想的精髓部分.

    萬物皆物件

    1:類

    舉個例子:在超時裡面進行商品購物的時候,它所有的商品都是按類目來劃分的.生活用品,食品等.這就是按類別來分.而在自然界中也是.如:動物昆蟲等.這就是類.將一類相似的的東西抽象成一類東西.

結構化程式設計

    程式 = 演算法 +資料結構

面向物件設計OOP

    OBJECT ORIENRED PROGRAMING
    Object oritened programing
    程式 = 物件 +物件 +....
    關鍵:讓每個物件都負責執行一組相關的任務

面向物件開發正規化的特性:

    萬物皆是物件
    程式是一組物件彼此之間在傳送訊息
    每個物件都有自己的記憶體佔用,可以組裝成更大的物件
    每個物件都有型別,特定型別的物件都可以接收相同的訊息

概念:

類:類是建立物件的模板和藍圖,類是一組相似物件的共同抽象定義
物件:物件是類的例項化結果,物件是實實在在的存在,代表現實世界的某一事物

物件的三大特性:

    行為:物件能幹什麼
    狀態:物件的屬性,行為的結果
    標識:物件的唯一身份;

類和物件的區別:

    類是靜態定義
    物件是動態例項
    建立模型得到的是類而非物件

聯絡:

    類是物件的定義
    物件的產生離不開類這個模板
    類存在的摸底是例項化得到物件

世界是由物件組成的

定義一個類的步驟: 
1:定義類名 
2:編寫類的資料成員代表屬性 
3:編寫類的方法代表行為

類的建模是一個抽象和封裝的過程: 
抽象:去掉不關注的,次要的資訊而保留重要的資訊 
封裝:資訊打包 
具體一點:將資料和行為結合在一個包中,對物件的使用者隱藏資料的具體實現方式 
實現封裝的關鍵:不能讓類中的方法直接訪問其他類的內部資料,只能通過公開行為方法間接訪問:

        例子:

            class ClassName{
                field1;
                field2;
                .....;
                constructor;
                .....
                method1;
                method2;
            }

物件的兩種類的形式:

    1:結構體形式:
    struct Saving{
        unsigned accountNumber;
        float balance;
    };
  缺點:安全性不好,任何人都是可以進行訪問的     

    2:class形式:
    class Savings{
        public:
            float deposit(float amount){
                balance +=amount;
                return balance;
            }
        private:
            unsigned accountNumber;
            float balance;
    };
    優點:類不僅可以保護資料,而且可以提供成員函式來操作

C++用類來定義抽象資料型別

C++早期的版本被成為帶類的C

class 類名稱{
    public:
        //共有函式
    protected:
        //保護成員
    priva