C 類中為什麼只有建構函式和拷貝建構函式有引數列表

時間 2021-05-14 09:59:48

1樓:匿名使用者

對類的成員函式宣告來說,參數列不是建構函式和拷貝建構函式的專利,一般的類的成員函式,也是可以選擇引數個數的。並且還要注意,就算是那些比較「特殊」的成員函式,如operator=,也是有函式表的,而且拷貝建構函式由於其功能的原因,它的參數列還是固定格式的。

我猜你是想問,為啥解構函式就沒有參數列呢,如果是,那麼這個問題可以從兩方面來說:

一是形式。建構函式有不同的參數列,這樣你在用類去構造,建立新物件時,你可以通過不同的形式來完成初始化。比如,你可以:

someclass obj1,obj2(1,2,3);

someclass obj3(obj1);

這樣,可以完成不同形式的初始化。但對應的物件的析構,如果這個類物件是自動變數,它就自動在其自動作用域結束的地方析構;如果是new/delete的,編譯器也會把**做成在delete時去自動呼叫析構,再**空間。這兩種情況下,也都沒有給這個物件寫出按引數呼叫析構機會,甚至乾脆沒有顯式呼叫解構函式的機會,因此解構函式不存在說有參數列一說,要是有,該怎麼寫呢?

也沒有用到。

二是功能。為什麼會有上邊的那種不對稱的形式呢?因為物件的構造本身,是按不同的條件,去初始化物件內的成員資料,因此提供不同介面,會帶來靈活性。

但是物件的析構,很單純,就是不再要這裡所有的資料了,不管你當初是怎麼初始化的,現在的目標就是:全部都銷燬,有啥毀啥。你可能會問,那如果我初始化時,有可能提供了多種構造方式,那析構時可能也要有多種對應不同的策略,一個析構怎麼弄呢?

答案還是說回形式上去了:構造就是為了方便類的呼叫方方便,為其提供多種選擇。這不同的選擇導致的構造的內部不同,是類應該封裝的,即類內**可以主動去記載構造時的不同方式,析構雖無引數,也可以分別作出自己正確的行為。

最後要多說一句,如果是定位new,那麼使用者需要自己呼叫析構。不過按照上段(即二)的分析,也就是呼叫一下解構函式就行了,不需要指定引數。

2樓:

因為只有這兩個函式能用於構造類物件的初始化,而引數列表只有初始化時才能用到,其他函式都是構造完物件之後才根據呼叫執行的

c++中,為什麼有些建構函式引數列表中的引數沒有給完全

3樓:匿名使用者

建構函式可以有預設的引數列表

如定義一個矩形類rectangle

class rectangle

};令長寬的預設值為30,20

則建立物件時:

retangle a,b(25),c(25,15);

a:長30寬20

b:長25寬20

c:長25寬15

但一般不建議這麼做,因為這樣做時如果類體中還有其他的建構函式,很容易導致過載錯誤

如:rectangle(int m):x_(x),y_(y){} //構造一個正方形

這麼做時在寫出rectangle a(40);的時候,究竟構造一個40*40的正方形,還是40*20的矩形呢?

c 中解構函式析構堆中物件和棧中物件有什麼區別

1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。2 堆區 heap 般由程式設計師分配釋放,採用誰分配誰釋放的策略。解構函式 1,對於棧區的變數如string 類,你定義後,應該程式退出的時候,由程式負責進行對string執行析構操作。2,對於你申請的指標或動態的陣列...

C 類有什麼作用,c 中的類是什麼作用,

小丁創業 類的作用是為了安全。用c語言定義一個函式,然後在其他檔案 假設有很多.c檔案 中,可以訪問定義的函式。除非將函式定義為靜態。對於類,只要將函式更改為私有,就只能由使用者訪問該函式,而不能訪問其他檔案,這等效於保護編寫的功能。類的作用是繼承。例如,汽車和火車可以同時繼承。這樣可以使程式的結構...

C 中的“類”是什麼意思,c 中的類和類的物件是什麼意思

光棍誓言 類就是就是有類似屬性的集合。舉個例子。就像是學生類是吧。這個類就可以定義許多有一定屬性的學生。就像身高,體重什麼的。因為這都是學生的屬性。不過0基礎的話,還是先學c,學會結構體。接著學c 過渡到類。真的,零基礎直接殺c 是吃力的。 令狐蛋蛋 相當於一個集合,型別。這個集體有共同的特徵,比如...