-1

関数またはコンストラクターのヘッダーに変数を割り当てることの利点は何ですか? 言い換えれば、次の 2 つのコード セットの違いは何ですか。

例 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];
    ...
  }
  ...
};

建設的な意見をいただければ幸いです。

4

5 に答える 5

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/ )

于 2013-06-25T14:09:55.530 に答える
2

これは、いわゆる既定の引数です: http://msdn.microsoft.com/en-us/library/91563f79(v=vs.80).aspx

違いは、最初のケースでは値を設定できますがvar、2 番目のケースでは設定できないことです。

于 2013-06-25T14:11:03.957 に答える
1

あなたが書いたものは 2 つの異なる存在です。最初の例では、var はinput parameter with a default value8*1024*1024 であり、2 番目の例ではlocal const variable. 振る舞いは同じでも、内部構造は同じではありません。

あるメソッドが他のメソッドよりも優先されるという質問に答えるには、設計に依存します. .

于 2013-06-25T14:13:59.700 に答える
0

しかし、どちらの場合も特に優れているわけではありません。メンバー変数は、コンストラクターの初期化リストで初期化する必要があります。constたとえば、これがメンバー変数を初期化する唯一の方法です。

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

それでも、スマート ポインターの方がb.

于 2013-06-25T14:17:53.693 に答える