類(lèi)的封裝與繼承
而合理的做法如下所述。
規則9-3-3(強制): 將成員函數聲明為static或者const類(lèi)型。
這是因為,將成員函數聲明為static或者const類(lèi)型,可以限制對于其非靜態(tài)數據成員的訪(fǎng)問(wèn),從而避免無(wú)意識下對數據進(jìn)行的修改。
每一個(gè)對象都有和簡(jiǎn)單變量類(lèi)似的建立過(guò)程,我們希望也能夠像對待普通變量那樣,當通過(guò)聲明語(yǔ)句分配內存空間之后,立即寫(xiě)入特定的數據。但由于對象的復雜性以及封裝需求決定了直接賦值不可行,為此C++嚴格規定了初始化程序的接口形式,并有一套自動(dòng)的調用機制。這里所說(shuō)的初始化程序就是構造函數,這個(gè)特殊的成員函數以及與之對應的析構函數,需要在封裝時(shí)給予特別的注意。
規則12-1-1(強制): 對象的動(dòng)態(tài)類(lèi)型不允許在其構造函數或者析構函數體內被調用。
在對象的構造和析構過(guò)程中,它最終的類(lèi)型可能會(huì )與完整構造的對象不一樣。在構造函數或者析構函數中使用對象的動(dòng)態(tài)類(lèi)型,將可能與開(kāi)發(fā)人員的預期不一致。對象的動(dòng)態(tài)類(lèi)型使用在如下的結構中:
◆典型的具有虛函數或者其基類(lèi)中具有虛函數;
◆dynamic_cast;
◆對于虛函數的虛調用。
此規則同樣禁止由構造函數和析構函數產(chǎn)生的對純虛函數的調用。那樣的調用將導致未定義的行為。下面來(lái)看一個(gè)較為特殊的函數――拷貝構造函數,以結束對封裝的討論。
拷貝構造函數是一種特殊的構造函數,其形參是本類(lèi)的對象的引用。其作用是使用1個(gè)已經(jīng)存在的對象(由拷貝構造函數的參數指定的對象)去初始化1個(gè)新的同類(lèi)的對象。
規則12-8-1(強制): 拷貝構造函數只允許對基類(lèi)以及它所在類(lèi)的非靜態(tài)成員進(jìn)行初始化。
如果編譯器接口發(fā)現1個(gè)對拷貝構造函數的調用是冗余的,它將忽略該函數調用。即使拷貝構造函數在構造對象之外還有其他功能,也不例外。這稱(chēng)作拷貝省略。因此當修改程序狀態(tài)的次數不能確定時(shí),保證不使用拷貝構造函數修改程序的狀態(tài),就顯得極為重要。相關(guān)例程如下:本文引用地址:http://dyxdggzs.com/article/173524.htm
上述例子里,在所有函數調用之后,m_static的數值由使用的是何種編譯器來(lái)決定,不是明確的值。這種不確定因素很可能帶來(lái)嚴重的安全隱患,顯然不是我們希望看到的。
3 籌――概念與代碼的重復利用
運籌學(xué)中一個(gè)經(jīng)典的例子是:用2個(gè)鍋同時(shí)煎雞蛋,每個(gè)雞蛋要煎2面,每煎1面1分鐘,問(wèn)煎好3個(gè)雞蛋最少要多少時(shí)間?對這個(gè)簡(jiǎn)單例子的解決過(guò)程反映了我們的思考習慣:面對新事物新問(wèn)題時(shí),首先考慮的是如何充分利用現有的工具和概念,如果需要的話(huà),在此基礎上作盡可能小的改動(dòng)。繼承與派生就是這種思想在C++中的體現。
按照真實(shí)世界的情況,在軟件設計中引入了類(lèi)的概念。同時(shí)我們注意到人們的特定思維習慣:當提到兩廂小轎車(chē)時(shí),遵循著(zhù)“交通工具→汽車(chē)→轎車(chē)→兩廂小轎車(chē)”的具象化過(guò)程,而不是從螺絲釘開(kāi)始想象。對于C++而言,面對新對象,首先想到的不是從成員開(kāi)始重新構建它,而是去尋找這個(gè)新對象與已有對象類(lèi)別的相似之處,看能不能最大限度利用已經(jīng)給出定義的類(lèi)來(lái)描述這個(gè)新對象。為新對象創(chuàng )建的特殊類(lèi),具有一般類(lèi)的全部屬性與服務(wù),稱(chēng)作特殊類(lèi)對一般類(lèi)的繼承。1個(gè)類(lèi)可以單獨存在,但是當利用繼承機制使用該類(lèi)時(shí),該類(lèi)就成為給其他類(lèi)提供屬性和行為的基類(lèi),或者成為繼承其他類(lèi)的屬性和行為的派生類(lèi)。
合理使用繼承可以顯著(zhù)提高代碼的利用率。規則10-1-2(強制): 只有在菱形結構中才允許將基類(lèi)聲明為虛基類(lèi)。
虛基類(lèi)會(huì )引入許多未定義和潛在的容易令人混淆的特性。因此,只有當該基類(lèi)在菱形繼承結構中作為公共基類(lèi)時(shí),才可以將其聲明為虛基類(lèi)。
評論