C 中的四個預設成員函式與運算子過載詳解

2022-10-04 00:51:10 字數 3297 閱讀 2580

一:類和物件的基礎知識:類的定義,訪問限定符,物件導向封裝性,物件的大小計算等等。(編譯環境為vs2015)

物件導向程式設計:

概念:(object oriented programming,縮寫:oop)是一種程式設計范型,同時也是一種程式開發的方法。物件指的是類的例項,將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性。

類:類的基本思想是資料抽象和封裝。類的介面包括使用者所能執行的操作;類的實現則包括類的資料成員、負責介面實現的函式體以及定義類所需的各種私有函式。要想實現資料抽線和封裝,就得先定義乙個抽象資料型別。

訪問限定符:1.public(公有屬性);2.private(私有屬性,預設情況下就為此屬性);3.protect(保護)

注:1. public成員可從類外部直接訪問,private/protected成員不能從類外部直接訪問;

2. 每個限定符在類體中可使用多次,它的作用域是從該限定符出現開始到下乙個限定符之前或類體結束前。

3. 類體中如果沒有定義限定符,則預設為私有的。

4. 類的訪問限定符體現了物件導向的封裝性。

例:定義乙個日期類

公有的成員函式可以在類內宣告類外定義,也可以在類內直接定義:

class date

;void date::display() //類外定義

如何例項化乙個物件?

class date

;int main()

1.類只是乙個模型一樣的東西,限定了類有哪些成員,定義出乙個類並沒有分配實際的記憶體空間來儲存它。

2.乙個類可以例項化出多個物件,例項化出的物件占用實際的物理空間儲存類成員變數。

乙個空類的大小是幾?

如果我們sizeof(date),出來的結果是12;但是如果這個類是空類呢?結果是多少?

class aa {};

int main()

輸出結果是1!

原因是編譯器給空類分配了乙個位元組的大小用來佔位。

注:結構體內存對其規則:

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

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

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

vs中預設的值為8

gcc中的預設值為4

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

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

2:類的四個預設成員函式及運算子過載相關知識

建構函式:

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

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

1. 函式名與類名相同。

2. 無返回值。

3. 物件構造(物件例項化)時系統自動呼叫對應的建構函式。

&nbwww.cppcns.comsp;  4. 建構函式可以過載。

5. 建構函式可以在類中定義,也可以在類外定義。

6. 如果類定義中沒有給出建構函式,則c++編譯器自動產生乙個預設的建構函式,但只要我們定義了乙個建構函式,系統就不會自動生成預設的建構函式。

7. 無參的建構函式和全預設值的建構函式都認為是預設建構函式,並且預設的建構函式只能有乙個。

例:我們平時最常用的就是全預設值的建構函式,定義方式如下:

date(int year = 1900, int month = 1, int day = 1)

//在main函式中按照下面方式進行初始化

//若不進行賦值,則採用預設值為1900-1-1

date d1(2017, 7, 6)

析構函式:

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

其特徵如下:

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

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

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

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

5. 注意析構函式體內並不是刪除物件,而是做一些清理工作。

就好比下面這個例子,建構函式開闢了size個int型別大小的空間,在程式結束時我們就應該釋放掉該記憶體空間,避免發生記憶體洩漏:

class array

~array() }

private:

int* _ptr;

};拷貝構造

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

例:date(const date& d)

//date d1(2017, 7, 4);

// 下面兩種用法都是呼叫拷貝建構函式,是等價的。

//date d2(d1);

//date d2 = d1;

特徵1. 拷貝建構函式其實是乙個建構函式的過載。

2. 拷貝建構函式的引數必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。

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

賦值運算子過載

拷貝建構函式是建立的物件,使用乙個已有物件來初始化這個準備建立的物件。賦值運算子的過載是對乙個已存在的物件進行拷貝賦值。

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

date& operator = (const date& d)

return *this;

} void test()

3:關於隱含的this指標以及對運算子過載背後做的事情。

隱含的this指標

1. 每個成員函式都有乙個指標形參,它的名字是固定的,稱為this指標,this指標是隱式的。(建構函式比較特殊,沒有這個隱含this形參)

2. 編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件位址作實參傳遞給成員函式的第乙個形參this指標。

3. this指標是成員函式隱含指標形參,是編譯器自己處理的,我們不能在成員函式的形參中新增this指標的引數定義,也不能在呼叫時顯示傳遞物件的位址給this指標。

例一:在拷貝建構函式中this所做的事情

例二:在運算子過載中this做的事情

總結本文標題: c++中的四個預設成員函式與運算子過載詳解

本文位址: /ruanjian/c/198664.html

C 四個預設成員函式 運算子過載

1 1 類的定義 在c 中,用 類 描述 物件 所謂的物件是指現實世界中的一切事物。類是建立物件的模板,乙個類可以建立多個物件,每個物件都是類的乙個具體 例項,擁有類的成員變數和成員函式。乙個簡單的類定義 class student 2 訪問限定符 宣告了對類的外部介面,所有來自外部的訪問通過介面進...

四個預設成員函式和運算子過載

1.類的定義 在c 中,用 類 描述 物件 所謂的物件是指現實世界中的一切事物。類是建立物件的模板,乙個類可以建立多個物件,每個物件都是類的乙個具體例項,擁有類的成員變數和成員函式。類的組成 資料 成員變數 和程式 成員函式 例子 class 1 建構函式 私有成員變數要對它們進行初始化,必須用乙個...

四個預設成員函式和過載運算子

1.類和物件的基礎知識 類實際上是對某種型別的物件變數和方法的原型,類是從一些具有相同屬性或功能的具體例項,抽象出共有的一些屬性的,自定義抽象資料型別。public成員可從類外部直接訪問,private protected不能從類外部直接訪問,每個限定符在類體中可以使用多次,類體中如果沒有定義限定符...