2010-06-25 24 views
7

我讀有關構造函數,使用建設者 - 奇懷疑

當一個對象實例化的一類,c'tors(如果明確書面或默認的)是要執行的起點。我的疑惑是

  • 是c'tor更像main()C
  • 是的,我明白,你可以 使用 c'tor設置所有默認值的點。我還可以通過編寫自定義方法來模擬 的行爲。那爲什麼是c'tor?

例子:

//The code below is written in C#. 
public class Manipulate 
    { 
     public static int Main(string[] args) { 
      Provide provide = new Provide(); 
      provide.Number(8); 
      provide.Square(); 
      Console.ReadKey(); 
      return 0; 
     } 
    } 

public class Provide { 
     uint num; 
     public void Number(uint number) 
     { 
      num = number; 
     } 
     public void Square() 
     { 
      num *= num; 
      Console.WriteLine("{0}", num); 
     } 
    } 

正在學習獨立地編制,所以我依賴於編程社區,你能不能也建議我一個很好的OOP的資源,以獲得更好的理解。如果不在話題請原諒。

+1

這只是一個快捷方式,所以你不需要不必要地編寫5行額外的代碼,只不過是setter。 – 2010-06-25 04:09:00

回答

3

頭先OOA & D將是一個好的開始。

你不覺得調用一個函數來設置你的類的每個成員變量是有點開銷。

使用構造函數,您可以一次初始化所有成員變量。沒有這個理由足夠你有建設者。

+0

我的觀點是除了初始化成員變量之外,還有其他什麼用途。還是更像是,而不是有一個單獨的方法聲明來初始化你使用構造函數嗎? – Chaitanya 2010-06-25 04:00:02

+0

這是什麼是OOP! – ckv 2010-06-25 04:08:54

1

通常,您應該在構造函數中完成所有初始化。構造函數是創建類的實例時首先調用的,所以您應該在此處設置任何默認值。

2

可以使用常規方法模擬構造函數和析構函數。但是,這兩種方法的獨特之處在於語言以特殊的方式處理它們。

他們是自動當一個對象被創建或銷燬時調用。這提供了一個統一的手段來處理必須發生在對象一生的兩個關鍵時期的最微妙的操作。它避免了班級的最終用戶忘記在適當的時間打電話給他們的可能性。

此外,繼承等先進的面向對象特性需要均勻性才能工作。

2

首先,大多數答案將至少取決於您使用的語言。在一種語言中具有重要意義的理由不一定在其他語言中有直接的類比。舉個例子,在C++中,有很多情況下會自動創建臨時對象。 ctor作爲該過程的一部分被調用,但對於大多數實際目的而言,不可能在過程中顯式調用其他成員函數。但這並不一定適用於其他OO語言 - 有些不會隱式創建臨時對象。

1

我認爲一個好的學習方法是比較語言之間的OOP,就像從不同的角度看相同的圖片。

Google上搜尋了一會兒:

爲什麼構造函數? 一個簡單的函數(也可能有內部函數)和一個對象之間的主要區別在於,一個對象可以託管在一個「變量」中,它的所有功能都在裏面,而且可以完全不同於其他「變量」與裏面的同一種「對象」。讓他們具有不同行爲的相同結構的方式取決於您給班級的論點。 所以這裏是一個懶惰的例子:

car()現在是一個類。

C1 =車()

C2 =車()

¿C1正是C2?是。

C1 =汽車(大衆)

C2 =汽車(蘭博基尼)

C1具有比C2相同的功能,但它們是完全地diferent種車的() 變量大衆和蘭博基尼被直接傳遞到構造函數。 爲什麼一個-constructor-?爲什麼沒有其他功能?答案是:訂單。

這是我最好的鏡頭,男人,在這個晚上。我希望我能以某種方式幫助你。

1

您不能在自定義方法中模擬構造函數,因爲在創建對象時未調用自定義方法。只有構造函數被調用。那麼,當然你可以在創建對象後調用你的自定義方法,但這不是慣例,而使用你的對象的其他人不會知道這麼做。

構造函數只是一個約定,作爲設置創建對象後的一種方式。

0

一個我們需要構造的原因是「封裝」,代碼做一些初始化必須在看不見的

0

你也不能強迫變量的傳遞,而無需使用構造函數。如果你只想實例化一個對象,如果你有一個int傳給它,你可以設置默認的構造函數爲private,並讓你的構造函數爲int。這樣,就不可能創建該類的一個對象而不需要一個int。

0

子對象將在構造函數中初始化。在像C++這樣的語言中,在包含對象中存在子對象(而不是作爲通過指針或句柄連接的單獨對象),構造函數是將參數傳遞給子對象構造函數的唯一機會。即使在Java和C#中,任何基類都是直接包含的,因此構造函數的參數必須由構造函數提供。

最後,任何常量(或在C#中,readonly)成員變量只能從構造函數中設置。即使從構造函數調用的輔助函數也無法更改它們。