C 自動提供的成員函式

2021-05-23 08:16:36 字數 1805 閱讀 3254

重新梳理一下知識

1預設建構函式

c++可以在將建立物件的初始化工作放在函式體內完成

特點:a建構函式是與所在類同名的函式

b建構函式沒有返回值

c建構函式可以過載

d建構函式的作用是為類物件的資料成員賦初值

e建構函式又定義類物件時由系統自動呼叫,不許像其他函式一樣直接由使用者呼叫

f建構函式一般是類的public成員

g系統預設的建構函式是x(){}   她只負責物件的建立,不做任何的初始化工作。一點有了建構函式,則系統提供的建構函式不再存在了。

2複製建構函式

用乙個以存在的物件來構造乙個新的物件,會呼叫建構函式,這是呼叫的是一種特殊的建構函式,也就是複製建構函式

同建構函式一樣,如果沒有定義複製建構函式,系統會提供乙個預設的複製建構函式,該預設扶著建構函式會自動完成將乙個已知物件的資料成員複製到另乙個物件的資料成員中的是所有操作 複製建構函式有乙個特點,函式只有乙個引數,並且是該類物件的引用。

類名::類名(類名&引用名)

一般的預設複製建構函式可以完成任務,但是單物件具有一些指成員是許願自己定義複製建構函式。

指標指向同一的陣列型動態堆空間叫做淺複製;

兩個物件的指標成員指向不同的動態空間叫做深複製;

何時生成臨時物件:

情形1:按值傳遞物件注意是按值傳遞物件,按值傳遞意味著會建立乙個原始物件的副本,

情形2:函式反回物件時。

情形3:用乙個物件初始化另乙個物件時即複製初始化,語句hyong x=y和hyong x=hyong(y)這裡y是hyong型別的物件。都將呼叫複製建構函式,但有可能建立臨時物件也有可能不建立臨時物件而用複製建構函式直接初始化物件,這取決於編譯器。

3預設析構函式

其名字和類名相同,在名字前加~

有如下特點:

a同類名,加~

b沒有返回值,無引數,不能過載,訪問控制一般問為public

c物件撤銷時由系統自己呼叫

d堆非動態物件,程式執行離開時他的作用域自動被撤銷,對動態物件,對齊delete才能撤銷

e沒定義,自動有乙個~x(){}

f呼叫的次序很構造相反,也就是說後構造先析構

4賦值操作符

賦值操作符即「

=」。賦值操作符為二元運算元,其操作目的是將右運算元的值複製給左運算元。由於左值涉及到寫操作,因此左值必須為非

const

量,而右值在賦值操作中只涉及讀操作,因此一般為

const量。

class a a(int i)

const a & operator =(const a & j) //過載賦值運算子必須是類的成員,過載賦值運算子應反回乙個類的物件的引用。

};

5位址操作符即this指標

用處:當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。

使用:一種情況就是,在類的非靜態成員函式中返回類物件本身的時候,直接使用 return *this;另外一種情況是當引數與成員變數名相同時,如this->n = n (不能寫成n = n)。

當你進入乙個房子後,

你可以看見桌子、椅子、地板等,

但是房子你是看不到全貌了。

對於乙個類的例項來說,

你可以看到它的成員函式、成員變數,

但是例項本身呢?

this是乙個指標,它時時刻刻指向你這個例項本身

C 成員函式的HOOK

今天hook d3d9中的setmaterial發現出現堆疊失衡現象,後來研究發現是因為,對於如下的呼叫 hresult stdcall setmaterial d3dmaterial9 pmaterial d3dmaterial9 mtrl zeromemory mtrl,sizeof d3dma...

c 類的成員函式

1 成員函式的宣告必須在類內,定義可以在類內或者類外。定義在類內部的函式隱式的為inline函式 非成員函式的宣告和定義都必須在類外。2 this指標 this指標是成員函式額外的隱式引數,this是乙個常量指標,不允許改變this中儲存的位址。預設情況下this的型別是指向類型別非常量版本的常量指...

C 的const成員函式

我們知道,在c 中,若乙個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如,cpp view plain copy const char blank blank n 錯誤 物件導向程式設計中,為了體現封裝性,通常不允許直接修改類物件的資料成員。若要修改類物件,應呼叫公有成員函...