這些函式在網上很容易就可以查到定義和寫法,這裡就不贅述了。令人感興趣的是這些函式什麼時候執行, 特別是複製建構函式和析構函式。
用編寫的一段(很醜的)**來說明。
#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.乙個物件通過另乙個...