建構函式,複製建構函式和析構函式

2021-10-06 00:04:59 字數 3875 閱讀 4508

這些函式在網上很容易就可以查到定義和寫法,這裡就不贅述了。令人感興趣的是這些函式什麼時候執行, 特別是複製建構函式和析構函式。

用編寫的一段(很醜的)**來說明。

#include

#include

#include

class

point

point (

const point& obj)

~point()

double

get_x()

const

double

get_y()

const};

// point&

// __doa(point *ths, const point& p )

// point&

// point::operator = (const point& p)

double

dist

(point a, point b)

class

circle

circle

(const circle& obj)

~circle()

point get_c()

const

double

get_r()

const};

bool

is_intersect

(circle o1,circle o2)

intmain()

輸出資訊:

# 建立a和b

creating a point...

creating a point...

# dist建立形參並且銷毀

copying a point...

copying a point...

1.41421

deleting a point...

deleting a point...

#建立circle的時候,首先建立臨時的point, 然後通過copy複製建立circle的c, 建立circle,最後刪掉臨時的point

creating a point...

copying a point...

creating a circle...

deleting a point...

creating a point...

copying a point...

creating a circle...

deleting a point...

# is_intersect先建立形參circle的c,然後通過copy複製建立形參

creating a point...

copying a circle...

creating a point...

copying a circle...

# 建立c1,c2, 使用函式get_c 會copy乙個例項出來,然後返回,刪掉。然後給dist傳參,這時候要建立形參,用完刪掉。刪掉c1,c2. 最後刪掉o1, o2(當然刪掉circle之後要把c也刪掉).

creating a point...

creating a point...

copying a point...

deleting a point...

copying a point...

deleting a point...

copying a point...

copying a point...

deleting a point...

deleting a point...

deleting a point...

deleting a point...

1deleting a circle...

deleting a point...

deleting a circle...

deleting a point...

# 可以看到,呼叫get_c也會使用複製建構函式

copying a point...

deleting a point...

# 最後刪掉main中建立的例項(按照建立時間倒序刪除,看來是堆疊)

deleting a circle...

deleting a point...

deleting a circle...

deleting a point...

deleting a point...

deleting a point.

..

從上面的輸出資訊可以發現這麼幾點:

構造使用了自底向上的順序, 而析構使用了自頂向下的順序。 比如給函式is_intersect傳遞形參的時候, 需要先建立乙個point, 也就是c. 因為copy函式是將所有的屬性進行複製, 而沒有point這個屬性的話是無法進行的。

傳遞形參, 建立返回值的時候, 經常使用到複製建構函式。 比如像dist函式傳遞形參的過程中。 還有get_c函式返回物件c, 即使只有簡單的一條語句, 也建立了乙個新的物件。

從函式中退出的時候, 本地產生的物件都會被析構, 釋放記憶體。

下面的**段是給函式盡可能加上引用之後的形式, 為了進行比較, 也輸出了相應的資訊。

#include

#include

#include

class

point

point (

const point& obj)

~point()

double

get_x()

const

double

get_y()

const};

double

dist

(const point& a,

const point& b)

class

circle

circle

(const circle& obj)

~circle()

point get_c()

const

double

get_r()

const};

bool

is_intersect

(const circle& o1,

const circle& o2)

intmain()

creating a point...

creating a point...

1.41421

creating a point...

copying a point...

creating a circle...

deleting a point...

creating a point...

copying a point...

creating a circle...

deleting a point...

copying a point...

copying a point...

deleting a point...

deleting a point...

1copying a point...

deleting a point...

deleting a circle...

deleting a point...

deleting a circle...

deleting a point...

deleting a point...

deleting a point.

..

傳遞引用可以減少很多不必要的構造, 節省記憶體空間, 同時也提高效率。

C 建構函式 析構函式 複製建構函式

無聊的廢話 距離開始放假已經過去半個月了,這半個月,品讀了一本實用型的繪畫書籍,作了幾幅作品,又做了乙個模型,只是探索未知領域總會遇到各種問題,甚至難以解決的問題,筆者頹廢了兩天煲了一部劇,覺得自己深深的辜負了時間,決定動手總結一下學過的知識,主要是總結資料結構,不過筆者看到當初c 的筆記,決定再鞏...

建構函式 複製建構函式 型別轉換建構函式 析構函式

成員函式的一種,名字與類名相同,可以有引數,不能有返回值 void也不行 乙個類可以有多個建構函式。如果定義類時沒寫建構函式,則編譯器生成乙個預設的無參建構函式,這個建構函式不做任何操作。如果定義了建構函式,則編譯器不生成預設的無參建構函式。物件生成時建構函式自動被呼叫,物件一旦生成,就再也不能在其...

建構函式 複製建構函式和析構函式的作用

建構函式 複製建構函式和析構函式是c 類中系統會預設建立的三個成員函式。建構函式 該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫建構函式,由其完成成員的初始化工作。建構函式可以有多個過載。複製建構函式被呼叫的三種情況 1.函式形參,呼叫函式時 2.函式返回值為形參時 3.乙個物件通過另乙個...