C 預設成員函式

2022-05-09 09:33:10 字數 3677 閱讀 8329

概念:(object oriented programming,縮寫:oop)是一種程式設計范型,同時也是一種程式開發的方法。

物件指的是類的例項,將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性。

c++不是純物件導向語言,而是基於物件導向的語言

(ps:因為它包含c的部分,c是面向過程)

物件導向三大特性:封裝、繼承、多型

①類的大小(是不是很疑惑,類腫麼還有大小,不就是個型別嘛,納尼)

是的類有大小,看個栗子:

class book

;

sizeof(book);會是多少?

有沒有算出來。

其實類和我們結構體一樣是有大小的,而且類的記憶體對齊方式和結構體一樣。

②為什麼要記憶體對齊?

這個要說到作業系統上了,我們的cpu把記憶體當成是一塊一塊的,塊的大小可以是2,4,8,16 個位元組,因此cpu在讀取記憶體的時候是一塊一塊進行讀取的,塊的大小稱為(memory granularity)記憶體讀取粒度。

為什麼要分塊呢?(分塊讀取有利於提高記憶體訪問效率)

和記憶體對齊有什麼關係?

假設cpu要讀取乙個4位元組大小的資料到暫存器中(假設記憶體讀取粒度是4),分兩種情況討論:

1.資料從0位元組開始

2.資料從1位元組開始

解析:當資料從0位元組開始的時候,直接將0-3四個位元組完全讀取到暫存器,結算完成了。當資料從1位元組開始的時候,問題很複雜,首先先將前4個位元組讀到暫存器,並再次讀取4-7位元組的資料進暫存器,接著把0位元組,4,6,7位元組的資料剔除,最後合併1,2,3,4位元組的資料進暫存器,對乙個記憶體未對齊的暫存器進行了這麼多額外操作,大大降低了cpu的效能。

所以記憶體對齊就很好的提高了cpu的讀取效率。

記憶體對齊的計算?

1.第乙個成員在與結構體變數偏移量為0的位址處。

2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。

vs中預設的值為8

gcc中的預設值為4

3.結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。

4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

空類的計算

先說答案:空類的大小是1

c++的類有六個預設成員函式:

我們常用的是前四個。

1)建構函式:

成員變數為私有的,要對它們進行初始化,必須用乙個公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時呼叫的函式稱為建構函式(constructor) 。

建構函式是特殊的成員函式,其特徵如圖:

建構函式基本我們都使用全預設的過載函式。

2)拷貝建構函式:

建立物件時使用同類物件來進行初始化,這時所用的建構函式稱為拷貝建構函式(copy constructor),拷貝建構函式是特殊的建構函式。

來個例子:

class book

;int main( )

特徵:

拷貝建構函式其實是乙個建構函式的過載。

拷貝建構函式的引數必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。(思考為什麼?)

若未顯示定義,系統會預設預設的拷貝建構函式。預設的拷貝建構函式會,依次拷貝類成員進行初始化。

一般情況下我們會使用系統預設的拷貝建構函式,但是在特殊情況下需要顯示定義(比如鍊錶的拷貝構造)

3)析構函式

當乙個物件的生命週期結束時,c++編譯系統會自動呼叫乙個成員函式,這個特殊的成員函式即析構函式(destructor)

建構函式是特殊的成員函式,其特徵如下:

析構函式在類名加上字元~。

析構函式無引數無返回值。

乙個類有且只有乙個析構函式。若未顯示定義,系統會自動生成預設的析構函式。

物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。

注意析構函式體內並不是刪除物件,而是做一些清理工作。(怎麼理解這裡的清理工作?參看下面的**)

class date

private :

int _year ;

int _month ;

int _day ;

};

class array

// 這裡的析構函式需要完成清(shi)理(fang)工(kong)作(jian)。

~ array ()

}private :

int* _ptr ;

};

4)賦值操作符過載為了增強程式的可讀性,c++支援運算子過載。

運算子過載特徵:

operator+ 合法的運算子 構成函式名(過載《運算子的函式名:operator< )。

過載運算子以後,不能改變運算子的優先順序/結合性/運算元個數。

5個c++不能過載的運算子: .*/::/sizeof/?:/.

5)取位址操作符過載

class date

const date * operator&() const

private :

int _year ; // 年

int _month ; // 月

int _day ; // 日

};

6)const修飾的取位址操作符函式在成員函式後面加const,const修飾this指標所指向的物件,也就是保證呼叫這個const成員函式的物件在函式內不會被改變。

class date

{public :

void display ()

{cout<

詳細例題會在後面博文中專門解釋。

c 類的預設成員函式

類的組成包括資料成員與成員函式。在類中一共有有六個預設成員函式,建構函式 拷貝建構函式 析構函式 賦值操作符過載 取位址操作符過載 const修飾的取位址操作符過載 利用乙個例項 日期類 進行舉例 先是定義乙個日期類 class date 這就是乙個簡單的類定義。下面依次介紹各個預設成員函式 一.建...

C 預設成員函式和this指標

類的六個預設成員函式 在學習這些預設的成員函式之前,務必先來了解一下this指標,因為除了建構函式外其他的預設成員函式都有乙個隱式的形參 this指標。這對於我們之後在預設成員函式的學習和使用方面有著很大的影響。this指標 1 每個成員函式都有乙個指標形參,他的名字是固定的,稱為this指標,th...

C 類的預設成員函式

class test 這些函式只有在需要的時候才會產生,空類占用 個位元組。類為了保護資料成員,其所有資料成員都預設是私有的 private 這也就意味著程式只能通過類裡面的函式提供介面來訪問資料成員。例如,下面程式用日期類建立了乙個物件,並進行初始化 class date int main 為了解...