面向對象(一)

對象生滅

面向對象的上一篇筆記是關於類的技術性問題,而這篇筆記則針對的是錢老書中的第九章——對象生滅。探索對象這一類的具體表現的生命週期問題。
//////////////////////////////////////////////////////////////////////////////////////////////////////
1,問題引導
2,關於構造函數
    這個問題錢老書中的敘述值得注意的都是細節,大的概念都是一樣的。
2.1 形如Date d;這種形式定義的對象,調用的是默認的構造函數。如果未定義默認構造函數,則創建出的對象就如同int d;一樣,全局則爲0,局部則爲隨機量;
2.2 注意一下語法細節:

2.3 一次性對象(無名對象),直接以類名調用構造函數。

3,以下內容較新鮮(仍是關於構造函數的):
1,組合對象構造過程。
2,在構造函數體中是無法完成對常量成員與引用成員的初始化的。這是因爲對於一個已經創建的常量,再賦給新值是沒有道理的。引用也只能在創建時進行變量實體的對應,對於一個引用來說,之後的賦值語句並不表示再次與變量對應,而是間接操作了引用所對應的變量。
3,那怎麼辦呢?
使用成員初始化列表。如下所示:

上圖中所顯示的是:在Student類的構造函數中所使用的成員初始化列表。對於變量id而言,其類型爲StudentID,是一個類類型,成員初始化列表會調用該類的構造函數完成對其的初始化;而變量name是string類型,name(n)等價於對成員變量name的初始化name=n;這種形式。換句話說,對於類對象成員或普通變量成員而言,成員初始化列表均能達到對其進行初始化的目的。
如下圖所示:
新鮮內容結束☺
4,構造順序
1,C++規定了構造對象的順序。
2,局部對象

3,全局對象
特點:在主函數執行之前,全局對象已經構造了。
因爲具有此特點:與變量不同,對象的構造必須調用構造函數實現,也就是說,在主函數執行之前,已經有代碼執行過了(全局對象所調用的構造函數),這一點需要注意。
導致:不利於程序調試。因爲調試總是從main函數開始的,因此在捕捉到錯誤之前,錯誤可能已經產生。
解決方案:①先將全局對象作爲局部對象來調試;②在構造函數中打印語句。
全局對象最敏感問題——全局對象構造問題

    也就是說,全局對象的創建順序是由編譯器所決定的,不同的編譯器有不同的實現,這是程序員所無法預料的。也因此,儘量少使用全局對象,尤其是不要讓全局對象之間相互依賴。示例程序見:錢老.308頁。
4,成員對象(Member Objects)
    何爲成員對象?就是在類中作爲成員的對象。而成員對象以其在類中聲明的順序構造。成員初始化列表(構造參數表)也無法改變此順序。
構造順序結束☺
5,構造位置
1,全局數據區
        特點:對象的生命期與程序運行期一致。
        包括:全局對象、靜態對象、常對象
2,棧區
        函數內部定義的對象構造在此。
3,堆區(動態內存區)
        new申請,delete釋放。
        如:vector<int> * pVi = new vector<int>[100]; // 申請
               delete[] pVi; // 釋放
4,
看下圖:


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

以下內容爲 拷貝構造函數 與 操作符重載。這兩點內容是C++語法的特點。
一、拷貝構造函數
主要總結內容見筆記本中“拷貝構造函數”一文。
附加內容:
1,拷貝構造函數與析構函數是成對出現的。因爲析構函數的作用是釋放掉數據指針所指向的空間,而存在數據指針所指向的空間的地方,就需要拷貝構造函數來完成創建時的拷貝工作。
2,析構函數是三無產品:
無返回值、無參數、無重載(形式)。
3,摘錄書中關於拷貝構造函數格式的說明:

二、操作符重載
    此處所涉及到的重載操作符爲賦值符(=)。賦值運算符之所以在這裏被着重提出,源於:對於基本數據類型,存在賦值操作,如int i = 2; int j; j = i;。出於類的完整性,這樣的操作對於自定義類型也應該有定義。C++中,提供了一個默認的對於賦值運算符的實現,但是這個實現也只是對於對象成員本體的複製,當本體與實體不一致時,同樣面臨着 深拷貝 與 淺拷貝 的問題。因此,一般情況下,拷貝構造函數、析構函數、重載的賦值運算符函數都是一起在類中定義的,因爲這三個函數都是對於本體與實體不一致這一情況的處理。
    以上所描述的是對賦值操作符進行重載的原因。接下來就介紹一下實現重載賦值操作符的技術。
一圖勝千言:
    
New Content:
    C++對類的支持的確很完備。接下來介紹的概念對應於基本數據類型的自動轉換。如:int i = 2; double d; d = i;。此時,會發生int類型向double類型的轉換。而對於類類型,自動轉換的實現需要我們編程實現。
    技術內容如下圖所示:

結語:
        這兩篇總結可以歸納爲一個主題:基本類機制。其所介紹的內容都是最基本的類的定義、對象的創建與析構、對象的拷貝構造和拷貝等內容。截止目前,所介紹的內容只是足夠我們建立一個有一定完整性的自定義類,而涉及的特性也只有數據封裝和信息隱藏。通過最近的學習我隱約感受到了類機制的強大與C++的複雜。接下來對於面向對象的學習進行到了把一個個孤立的類架構起來,組織其爲層次結構這一階段。
//////////
2014-10-29
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章