C 預設生成的成員函式

2021-09-18 02:51:56 字數 1587 閱讀 4961

預設建構函式(如果未顯式宣告建構函式)

預設複製建構函式(如果未顯式宣告複製建構函式)

析構函式(如果未顯式宣告析構函式)

=賦值運算子函式(如果未顯式宣告)

&取位址運算子函式(如果未宣告)

首先明確一點,分配物件空間後,一定會呼叫構造

物件空間釋放前,一定會呼叫構造至於為什麼析構在釋放之前呼叫,是因為如果物件如果先釋放,那麼就沒有物件了,而析構函式又是成員函式,所以,先呼叫析構,後釋放空間。例如,我們可以在析構函式中使用任意乙個成員變數,所以,在使用的時候,物件空間一定存在

class_name(){}
沒錯,預設建構函式啥也沒乾,它的作用就是在分配物件空間時,有建構函式可以呼叫。

預設無參的建構函式

class_name(const class_name &obj)
在成員中有指標變數時,這裡只是簡單的複製了值這可能會引起錯誤

定義時初始化直接用同類物件賦值

函式值傳遞時,形參變數初始化

函式按值返回時,返回值的臨時物件空間

~class_name(){}
預設的析構函式也是啥也不幹,為了在釋放物件空間前,有析構函式可以呼叫。

如果有指標成員,一般在析構函式中釋放,不過為了不出錯,還需要顯式地宣告定義複製建構函式和複製運算子函式,否則會發生錯誤,這裡如果不明確,先不要管,在後面會談到

const &operator=(const class_name &obj)
這裡也是簡單的複製了值,如果成員有指標,也可能引起錯誤。

同類物件之間賦值(非定義時初始化)

#include using namespace std;

class a ;

a::a()

a::~a()

int main()

執行之後發現,有錯誤。結果顯式「只呼叫了一次構造」(其實呼叫兩次),而且程式會不正常執行。

明明建立了兩個物件,為什麼僅輸出了一次呼叫建構函式地資訊? 呼叫了兩次,obj2呼叫了預設的複製建構函式

上面說過,呼叫預設的複製構造,僅僅複製了值,所以obj1.pint和obj2.pint指向了同乙個整型單元,main()結束之後,要釋放單元,所以obj2要呼叫析構函式,將成員指向的單元釋放;然後,obj1呼叫析構函式,再次釋放了同一塊空間。同一塊空間釋放兩次,這就是程式不正常執行的原因

同樣:

a obj3;

obj3 = obj2;

預設的賦值也會造成上述情況

class a ;

a::a()

a::~a()

重定義複製構造:

a::a(const a &obj)
重定義複製運算子:

const a &a::operator = (const a &obj) 

int main()

C 預設成員函式

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

c 類的預設成員函式

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

C 類的預設成員函式

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