關於類的賦值 構造 析構的一些啟發

2021-09-05 12:00:05 字數 1491 閱讀 5751

前情提要

在做資料結構課程設計第十題排列的時候,建立了乙個datalist的類,在sort類中呼叫以儲存乙個隨機序列。

但,每一次排序要保證不在datalist的例項datalist上直接操作,因此每次進行不同的排列都要建立乙個新的datalist例項。

在這其中包括sort類初始化的時候都遇見了一些情況是我沒有想象到的,通過給datalist類的建構函式和析構函式新增了address標記,勉強能看出他們的流程。在這裡記錄一下。

執行結果

address=0019fd48無引數構建

sort:

:sort()

我估摸著,應該是sort類初始化在呼叫構造sort()函式之前,就已經把其中的一些成員變數例項化了。否則應該先出現instruct()的指導內容,然後才是datalist的直接帶引數的構建。

address=0019fb58有引數構建

datalist =

datalist

(i);

這一語句相當於建立了乙個新的沒有名字的datalist例項,讓datalist的值等於它(過載了operator=()的函式,否則兩個datalist變數會指向同一位址),然後datalist析構。

address=0019faf4無引數構建

datalist sort:

:insertionsort

(const datalist& list)

//**1**

datalist list = list

//**2**

datalist list;

list = list;

這兩種方式不一樣。

第1種的list和list指向同乙個物件,只呼叫一次建構函式。且這個建構函式既不是我們設定的已知的預設無引數建構函式,也不是我們設定的有引數的建構函式。

第2種的list先呼叫了乙個無引數的建構函式,然後被引數list賦值。

值得注意的是return的機制,return先用不知名的建構函式構造了乙個沒有名字的datalist例項,然後用不知名的複製(賦值?)函式把list的資料傳給這個例項。但是在這個函式結束之前,這個例項又被析構掉了。是先析構,再return。 這樣可以說明為什麼我在~datalist()中delete了動態陣列data後,呼叫函式返回乙個datalist,使用時會報錯。

參考**:

1.c++:類中的賦值函式

2.從乙個例子講解拷貝建構函式與return

純屬個人理解,有錯誤請批評指正。

類的構造 析構 拷貝 賦值函式

讀 高質量程式設計指南 chapter 14總結 一般情況下,對於任意乙個類a,如果不顯示的宣告和定義,會自動生成預設的4個public inline函式 class a 1,初始化和賦值的區別 初始化是在建立物件時使用初始值直接填充物件的記憶體單元,因此不會有資料型別轉換,也不會產生臨時物件。而賦...

類的構造 拷貝 賦值 析構函式

賦值運算子 析構函式 總結構造 拷貝 賦值 析構函式是類的四個特殊成員函式,其特殊之處在於,即使我們沒有定義這些函式,編譯器也會自動提供預設函式,但如果我們提供了這些函式的顯式定義,那麼編譯器將不會再提供。這可能導致一些隱藏的問題,因此,我們需要對他們的實現進行充分的認識。假定有乙個類klunk,那...

C 構造 析構的一些理解

wiki c 類 effective c 構造 析構 賦值運算子 構造 析構 賦值運算子 c 類四個預設函式 建構函式 析構函式 拷貝函式 賦值函式 建構函式 析構函式 拷貝函式 賦值函式 c 多個建構函式的問題 概要 在c 中,每乙個類都會有乙個或多個建構函式,乙個析構函式,乙個賦值函式。建構函式...