C 預設成員函式和this指標

2021-08-21 22:13:07 字數 4168 閱讀 5294

類的六個預設成員函式

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

this指標

1、每個成員函式都有乙個指標形參,他的名字是固定的,稱為this指標,this指標是隱式的(建構函式沒有this指標)。

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

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

如圖:編譯器處理成員函式隱含的this指標:

需要注意乙個問題,有時候也會被面試問到。

this指標是隱式的,不需要我們定義也不需要顯式的傳參,但他依舊是乙個形參,因此this指標存在於棧上。

接下來我們主要學習以下4個預設成員函式。

1、建構函式

首先我們就有乙個問題,在定義乙個類時,我們通常會將成員變數定義為私有的,那麼我們如何對這些私有的成員變數進行初始化呢???

//比如我們定義乙個日期類

class date

//我們看到這裡的成員變數是私有的,如何初始化?

//這裡我們就有了建構函式這一說

注意一點:建構函式是公有的,並且只在定義物件時自動執行一次

什麼樣的函式才叫建構函式呢??接下來看一下建構函式所具有的幾大特徵

1、函式名與類名相同

2、沒有返回值

3、物件構造時系統自動呼叫對應的建構函式

4、建構函式可以過載

5、可以在類裡面定義,也可以在類外面定義

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

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

**展示:

class

date

//無參建構函式與全預設的建構函式都是預設建構函式,且只能存在乙個。

全預設的建構函式

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

////2:帶參建構函式

date(int year,int month,int day) //可構成函式過載

//1和2兩個建構函式構成函式過載

//函式過載:函式名相同,引數列表不同(引數個數,引數型別)

//返回值可同可不同。

void show()

;void test()

2、拷貝建構函式我們有時候會遇到一種情況就是當我們例項化出乙個新的物件時,想要用乙個同類的物件對其進行初始化,這時我們就需要用到拷貝建構函式。

拷貝建構函式的特徵:

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

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

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

**展示:

class date

//拷貝建構函式

為什麼拷貝建構函式必須使用引用傳參?因為使用傳值方式會引發無窮遞迴問題。

這裡的無窮遞迴問題到底又是怎麼一回事?

3、析構函式

我們知道建構函式是物件例項化時自動呼叫對應的建構函式,而當乙個物件的生命週期結束時也會自動呼叫乙個函式—析構函式。(其目的是為了做一些清理工作)

析構函式的幾大特徵:

1、函式名是在類名前加上~

2、沒有引數沒有返回值(包括void型別)

3、乙個類有且只有乙個析構函式(不能過載)

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

4、若類中沒有給出析構函式,則c++編譯器會自動產生乙個預設的析構函式(即使我們定義了,系統還是會自動生成乙個,在呼叫時先呼叫使用者自定義的在呼叫系統自動生成的)。

注意:因為我們說是在乙個物件的生命週期結束的時候呼叫析構函式,就會想到說那麼析構函式的作用就是把這個物件刪掉。其實不是,析構函式並不會把乙個生命週期已經結束的物件刪除,只是做一些清理工作。

問題又來了,清理工作到底是什麼???

**展示:

class array

//析構函式

~array()//沒有引數和返回值

}private:

int *_ptr;

};

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

運算子過載特徵:

1、operator+合法的運算子構成函式名(如:過載》運算子的函式名為 operator>)。

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

3、.(成員訪問運算子)

,.*(成員指標訪問運算子)

,::(域運算子)

,?:(條件運算子)

,sizeof(長度運算子)

。這五個運算子是不能被過載的。

賦值運算子的過載是對乙個已經存在的物件進行拷貝賦值。

**展示:

class date

//拷貝建構函式

date(const date& d)

//賦值運算子過載函式

date& operator= (const date& d)//&是引用傳參

return *this;

}private:

int _year;

int _month;

int _day;

};

那麼想一想,賦值運算子過載函式為什麼返回值是 date&呢???

看一下:

date d1;

date d3;

d3 = d1;//呼叫賦值運算子的過載

//走到這我們的d1已經賦給了d3

//試想。如果賦值運算子的過載返回的不是date&,假設是void

//那麼如果我們還想要將d3賦值給另外乙個物件,一定是不行的

//因為在型別上都不匹配了,新例項化的物件是date,而你在之前

//的賦值完成返回以後就把d3的型別改了,不再是date類的物件了

所以說,之所以要返回date&,是為了之後可以繼續使用進行賦值。

另外需要注意的一點就是,拷貝構造的呼叫和賦值運算子過載的呼叫的區別。

date d1;

//呼叫拷貝構造

date d2 = d1;//此時d2還並不存在

//呼叫賦值運算子的過載

date d3;//d3已經被例項化出來

d3 = d1;

//拷貝構造,顧名思義就是以拷貝的方式去構造出來,

//所以操作的物件是乙個不存在的物件和乙個已經存在的物件之間

//賦值是兩個都已經存在的物件之間進行

C 預設成員函式

概念 object oriented programming,縮寫 oop 是一種程式設計范型,同時也是一種程式開發的方法。物件指的是類的例項,將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性 靈活性和擴充套件性。c 不是純物件導向語言,而是基於物件導向的語言 ps 因為它包含c的...

c 類的預設成員函式

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

C 類的預設成員函式

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