2013-06-25 61 views
-1

在函數或構造函數的頭文件中分配變量有什麼優點(如果存在的話)?換句話說,下面兩組代碼之間有什麼區別?爲什麼我會比另一組更好?函數頭中的變量賦值

實施例1:

class A { 
private: 
    char* b; 
public: 
    A(size_t var = 8*1024*1024) { 
    ... 
    b = new char[var]; 
    ... 
    } 
    ... 
}; 

實施例2:

class A { 
private: 
    char* b; 
public: 
    A() { 
    const size_t var = 8*1024*1024; 
    ... 
    b = new char[var]; 
    ... 
    } 
    ... 
}; 

我明白任何建設性輸入。

+1

One允許您設置數組數據成員的大小,而另一個不允許。 – juanchopanza

回答

6

這是一個默認參數。它允許調用者在不傳遞參數的情況下調用函數,在這種情況下使用默認值。

所以在第一個例子中,我們可以稱之爲:

A* myADefault = new A(); // creates A with default value (8*1024*1024) 
A* myLargerA = new A(16*1024*1024); // creates A passing 16*1024*1024 instead of the default 

(更多信息,請查看「的默認值在參數」,在本教程節:http://www.cplusplus.com/doc/tutorial/functions2/

+0

爲什麼所有的指針和「新」? – juanchopanza

+0

@juanchopanza我只是想明確調用構造函數。我打算只用'A();'來明確地顯示構造函數沒有參數被調用,但是如果這被解釋爲編譯器的函數聲明,我會感到困惑......:P – filipe

+1

好的,我明白了。你可以在C++ 11中使用'{}',這樣可以避免令人煩惱的解析。你也可以說'A a = A()'等等。 – juanchopanza

2

這真的很不同。

第一個表示默認值,這意味着您可以聲明A testA test2(42)。在test,b將具有8 * 1024 * 1024的大小。在test2,b將有42的大小。

第二個片段只是一個常量值。

你會prefere一個其他根據您的需求...

1

你寫的是兩種不同的存在:在第一個例子中,var是8 * 1024 * 1024的input parameter with a default value,而第二個是local const variable。即使行爲相同,內部結構也不一樣。

爲了回答您關於一種方法優於另一種方法的問題,它取決於您的設計:前者增加了一些靈活性,但也暴露了一個可能應該隱藏的參數,而後者更僵化,而且不太容易出錯。

0

但這兩種情況都不是特別好。成員變量應該在構造函數初始化列表中初始化。例如,這是初始化const成員變量的唯一方法。

class A { 
    private: 
     char* b; 
    public: 
     A(size_t var = 8*1024*1024): b(new char[var]) { 
      ... 
     } 
     ~A() { 
      delete [] b; 
     } 
}; 

即使如此,智能指針會更好,b