2014-10-17 153 views
1

我是OOP的新手。我仍處於學習階段。爲什麼我們需要OOP中的構造函數?

爲什麼我們需要構造函數?當我們可以通過編寫「初始化函數」初始化屬性的值(變量)?

基本上,爲什麼我們寫一個構造函數,當我們可以通過編寫一個初始化變量的函數來實現相同的結果呢?

回答

2

構造函數是「初始化函數」

而不是調用兩個功能

object = new Class; 
object.initialize(); 

您只要致電

object = new Class(); 

構造函數中的邏輯可以是相同的內部的邏輯初始化函數,但它更整齊,避免你命名你的函數initialize(),我命名我的initialize_variables()和其他人命名他們的it_vars()...一致性很有用。

如果您的構造函數非常大,您可能仍希望將變量初始化拆分爲單獨的函數並從構造函數中調用該函數,但這是該場景的特定例外。

+0

這是不是真的。在許多語言中,構造函數不能調用其他構造函數,因此需要一個獨立的初始化函數,該函數要麼由外部調用,要麼由構造函數的每個重載調用。還有一些模式,其中對象在第一次使用前構建並初始化。還有一些非常有用的模式需要命名的靜態工廠方法來調用私有或受保護的構造函數。 – Xharlie 2014-10-17 12:07:12

+1

同樣,這是「標準」的一個例外,您可能希望使用單獨的函數來初始化變量(或執行對象的每個實例化「共享」的其他處理)。它不會刪除構造函數的用處,也不會暗示構造函數應該被變量初始化函數替換。在特定情況下,沒有任何東西可以阻止您將構造函數留空並調用其他函數,但是這不會改變OOP範例中構造函數的概念。 – 2014-10-17 12:09:54

+0

我不認爲構造函數是無用的,只是構造函數!=初始化方法。他們都有他們存在的理由。這個答案表明,初始化方法永遠不會超過重構工具,因此所有的代碼都沒有綁定到一個構造方法中。坦率地說,這不是事實。 – Xharlie 2014-10-17 12:14:06

0

由於構造是完全爲:只要你想避免使用「初始化函數」

另外,你可以有儘可能多的構造函數:你探微餵它們一些參數,這取決於你想怎麼inialize你的對象。

+1

「所有的構造函數調用Object類的構造函數」在所有語言中都不是這樣的幾個沒有根類Object類 - 其他類可以選擇Object類 – Mark 2014-10-17 12:11:27

+0

您是對的,我已將您的註釋帶入帳戶 – stackSaru 2014-10-17 12:13:03

+0

和對象構造不是多態 – Mark 2014-10-17 12:14:56

0

通常將強制性的東西放到構造函數和可選的元素中放到Initialise函數中。

例如,考慮放大器要求電源,以便將其提供給其構造函數。從邏輯上講,你可能想打開它並設置它的權力水平,但有人可能會爭辯說,你可能不想這樣做,直到後來。在僞代碼中:

class Amplifier 
{ 
    public Amplifier(PowerSource powerSource) 
    { 
     // create amplifier... 
    } 

    public int PowerLevel; 

    public void Initialise() 
    { 
     // turn on... 
    } 
} 

上面的例子是比較薄弱的,但它說明了這些概念。然而,這總是一個設計問題,而且意見也會有所不同。

但是,某些類別的對象在構建階段必須執行明顯的設置操作。在這些情況下,擁有構造函數的要求很容易理解。例如,如果您的對象可能需要可變數量的內存,那麼構造函數將是分配它的合理位置,並且析構函數或終結器將是再次釋放它的合理位置。

0

構造函數是一個特殊的成員函數,它具有與類名相同的名稱,並且只要該類的對象被創建就被調用。它們用於初始化對象中的數據字段。

構造具有以下特點:

  1. 它具有相同的名稱,類名。

  2. 每當創建類的對象時調用它。

  3. 它沒有返回類型甚至無效。
  4. 它可以有參數。
  5. 構造函數可能被重載。
  6. 當編譯器在類中找不到任何構造函數時,會自動創建默認構造函數。
  7. 參數化構造函數可以使用this()方法調用默認構造函數。
  8. 對於靜態數據字段初始化,構造函數可以是靜態的。
  9. 它不被隱式繼承。

獲取更多信息 https://en.wikipedia.org/wiki/Constructor_(object-oriented_programming)

0

構造函數的作用是初始化變量/ values.it是「初始化函數」爲什麼我們使用的構造函數,而不是我發現。唯一的理由用於初始化變量的正常函數是阻止不同的人使用不同的函數名稱並避免模糊性,並且使用構造函數更容易,該構造函數在類運行時自動實例化,而不必編寫單獨的代碼instantiation.this可能看起來很小,並且像一些不需要太多工作的東西,但只適用於一個非常小的程序,對於較大的程序來說,鬥爭是真實的。

3

所以回答很簡單
爲什麼我們要寫構造函數?
因爲在C可以寫, int i;

如果像這樣寫在上面的情況下的數據類型和變量定義如果定義像這樣的存儲器分配用於i variable.So簡單這裏我們定義類名和變量名(對象名稱)我們可以創建分配給類名稱的內存。

示例 myClass objectName;

但是在C++中,new關鍵字用於動態內存分配,所以我們可以將這個動態內存分配給我們的類,但這裏是我們的例子myClass是我們的類,我們想分配給分配的動態內存。

所以

myClass objectName = new myClass();

,簡單的構造是類變量內存分配被稱爲constructor.`

相關問題