對類的理解(c++)

介紹目錄:c++

1.類成員數組

1.1 成員函數函數

1.2 構造函數this

1.2.1 對構造函數的理解spa

1.2.2成員初始化列表3d

 1.2.3必須使用成員初始化列表的幾種狀況指針

1.2.4對於拷貝構造函數的參數是一個引用的理解對象

1.2.5對深拷貝和淺拷貝的理解blog

1.3析構函數繼承

1.3.1 單繼承

1.3.2 多繼承

 1.4 操做符重載

1.4.1複製構造函數和賦值運算符的區別

2.成員函數的重載,覆蓋和隱藏

2.1成員函數的覆蓋

2.2成員函數的隱藏

 

1.類成員

1.1 成員函數

調用成員函數時,其實是使用對象來調用的。每一個成員函數(除static成員函數外)都有一個額外的,隱含的形參this.在調用成員函數時,形參this初始化爲調用函數的對象的地址。

例如: void Point3d::translate(Point3d* const this,const Point3d &pt){

this->x+=pt.x;

this->y+=pt.y;

this->z+=pt.z;

}

1.2 構造函數

若使用編譯器自動生成的默認構造函數,則類中的每一個成員,使用與初始化變量相同的規則來進行初始化。

a.類成員:運行該類型的默認構造函數來初始化。

b.內置或符合類型的成員的初始值依賴於對象的做用域:在局部做用域中這些對象不被初始化。在全局做用域中,他們被初始化爲0。

1.2.1 對構造函數的理解

假定有一個NoDefault類,他沒有定義本身的默認構造函數,卻有一個接受string實參的構造函數。由於該類定義了一個構造函數,所以編譯器將不合成默認的構造函數,意味着:

1)具備NoDefault成員的每一個類的每一個構造函數,必須在成員初始化列表中經過傳遞一個初始的string值給NoDefault構造函數來顯示的初始化NoDefault成員。

2)編譯器將不會爲具備NoDefault類型成員的類合成默認構造函數,若是須要提供默認構造函數,就必須顯示定義。而且默認的構造函數必須顯示的初始化NoDefault成員。

3)NoDefault類型不能用做動態分配數組的元素類型。

4)NoDefault類型的靜態分配數組必須爲每一個元素提供一個顯式的初始化式

5) 若是有一個保存NoDefault對象的容器,例如vector,就不能使用接受容器大小而沒有同時提供一個元素初始化式的構造函數。

總結:若是定義了其餘構造函數,提供一個默認構造函數老是對的。

1.2.2成員初始化列表

i是內存的垃圾數字,而j爲0.

在c++中,成員變量的初始化順序與變量在類型中的申明順序相同,而與他們在構造函數中初始化列表的順序無關。

 1.2.3必須使用成員初始化列表的幾種狀況

對於沒有默認構造函數的類類型的成員,以及const類型的成員變量和引用類型的成員變量,都必須在構造函數的初始化列表中進行初始化。

1.2.4對於拷貝構造函數的參數是一個引用的理解

若是拷貝構造函數中的參數不是一個引用,即形如:

CClass(const CClass c_class)

至關於採用傳值的方式,而此時會調用該類的拷貝構造函數,從而形成無窮遞歸的調用拷貝構造函數,所以拷貝構造函數的參數必須是一個引用。

1.2.5對深拷貝和淺拷貝的理解

淺拷貝:被複制對象的全部變量都含有與原來對象相同的值,而全部的對其餘對象的引用仍然指向原來的對象。換言之,淺拷貝僅僅複製所考慮的對象,而不復制它所引用的對象。

深拷貝:被複制對象的全部變量都含有與原來對象相同的值,出去那些引用其餘對象的變量。那些引用其餘對象的變量將指向被複制過的新對象,而再也不是原有的那些被引用的對象。換言之,深拷貝把要複製的對象所引用的對象都複製一遍。

1.3析構函數

無論類中是否認義了本身的析構函數,編譯器都自動執行類中非static數據成員的析構函數。

雖然構造函數不能定義爲虛函數,可是析構函數能夠定義爲虛函數。通常來講若是類中定義了虛函數,析構函數也因該定義爲虛析構函數,尤爲是類中有申請的動態內存,須要清理和釋放的時候。

與複製構造函數和賦值操做符不一樣,不管類中是否認義了本身析構函數,都會建立和運行合成析構函數,若是類中定義了析構函數,則類中定義的析構函數運行完之後運行合成析構函數。

(拷貝構造函數採用的是系統自動生成的版本,沒有輸出)

1.3.1 單繼承

派生時,構造函數和析構函數是不能繼承的(複製構造函數和賦值操做符重載函數也不能繼承),爲了對基類成員初始化,必須對派生類的構造函數和析構函數從新定義,並在派生類的構造函數的初始化列表中調用基類的構造函數。

當對象被刪除時,派生類的析構函數被執行,析構函數不能繼承,因此,在執行派生類的析構函數時,基類的析構函數被自動執行。(順序:先執行派生類的析構函數在執行基類的析構函數)

1.3.2 多繼承

多繼承時,派生類的構造函數初始化列表須要調用各個基類的構造函數。

此時構造函數初始化列表只能控制用於初始化基類的值,不能控制基類的構造次序,基類構造函數按照基類構造函數在類派生列表中出現的次序調用。

 

在虛繼承中,首先調用虛基類的構造函數,虛基類若是有多個,則虛基類構造函數的調用順序是此虛基類在當前類派生表中出現的順序,而不是他們在成員初始化列表中的順序。

 1.4 操做符重載

1.4.1複製構造函數和賦值運算符的區別

複製構造函數只在對象實例化是纔會被調用,在複製構造函數調用期間,這個對象處於未決狀態,複製構造函數不返回任何值。而賦值操做符是在一個現存的對象被賦予新的值時被調用。有返回值。

c++中空類默認產生默認構造函數,析構函數,複製構造函數,賦值運算符重載函數,取址運算符重載函數,const取址運算符重載函數。

operator new 和operator delete  與c中malloc和 free對應,只負責分配和釋放空間。(new爲new operator  是new運算符)

2.成員函數的重載,覆蓋和隱藏

只用在同一類中定義的同名函數才存在重載關係,主要特色是函數的參數類型和數目有所不一樣,但不能出現函數參數的類型和個數相同僅僅依靠返回值來區別函數。重載和成員函數是否爲虛函數無關。

2.1成員函數的覆蓋

覆蓋是指在派生類中覆蓋基類中的同名函數,要求基類必須是虛函數且:

1)與基類的虛函數有相同的參數個數

2)與基類的虛函數有相同的參數類型

3)與基類的虛函數有相同的返回類型或者與基類的虛函數的相同,或者返回指針(或引用)。而且派生類虛函數所返回的指針(引用)類型是基類中被替換的虛函數所返回的指針(引用)類型的子類型(派生類型)。

2.2成員函數的隱藏

隱藏是在某些狀況下,派生類中的函數屏蔽了基類中的同名函數,這些狀況包括:

1)

2)

相關文章
相關標籤/搜索