4

なぜC++はこのように設計されたのですか?...

(この質問は異なりますが、密接に関連しています

不可能: このポインターはデフォルトの引数として使用されます。なんで?)

4

2 に答える 2

11

実際、それは完全に正確ではありません。制限は次のとおりです。

8.3.6デフォルトの引数[dcl.fct.default]

7)ローカル変数はデフォルトの引数で使用されません。[ 例:

void f() {
int i;
extern void g(int x = i); //error
// ...
}

—例を終了]

8)キーワードthisは、メンバー関数のデフォルトの引数では使用できません。[ 例:

class A {
void f(A* p = this) { } // error
};

したがって、thisローカル変数をデフォルトとして使用することはできません。

たとえば、次のようになります。

int a = 1;
int f(int);
int g(int x = f(a)); // default argument: f(::a)
void h() {
  a = 2;
  {
    int a = 3;
    g(); // g(f(::a))
  }
}

gf(2)コンパイル時定数ではない値で呼び出されます。これは、標準から直接の例です。

このような理由はいつものことです。提案がなかったか、拒否されたか、必要ないと見なされたか、実装が難しすぎたためです。

于 2012-10-15T20:50:00.460 に答える
0

デフォルトの引数は、関数の本体で使用されるパラメーターの値です。この変数 (つまりパラメーター) の値は、関数の呼び出し方法に応じてオーバーライドされる場合があります。しかし、そうではありませんが、デフォルトの引数はこの変数の値であり、値を定義する必要がありますこの値が動的である必要がある場合 (コンパイル時にバインドされないようにする必要がある場合)、その値を計算するには別の関数を使用する方が適切であり、このdefault分野には適していないようです。また、そのようなシナリオに対して、C++ には既に適切なメカニズムがあります。つまりPolymorphism、関数のオーバーロードです。

Fnこれを考慮してください:関数をparamで呼び出す必要があるか、vそうでない場合はデフォルトでFn(x)ここvに設定され、x変数である必要があります。

デフォルトのパラメーターを持たなければならない代わりに、これは関数のオーバーロードを使用して簡単に実装できます。

BOOL x;

VOID Fn(BOOL v)
{
     ...
}

VOID Fn()
{
    Fn(::x);
}

VOID Main()
{
    ::x = ...; // Variable x's value is altered

    Fn(FALSE);
    Fn();      // Param value defaults to value of x
}

これにより、プログラマーは、長期的に見れば価値のあるより良いコードを書く必要があります。

于 2012-10-15T20:57:03.397 に答える