4

誰かが C++ のデフォルト コンストラクターのテンプレートを提供し、パラメーターに一連の名前のない変数があり、何らかの形で値が割り当てられていることを知りたいです。これは何を意味するのでしょうか?これは合法ですか?これらの変数にどのようにアクセスできますか?

私が受け取った例:

IntSet::IntSet(int = -1, int = -1, int = -1, int = -1); //default constructor

この使用法を明確にする回答をいただければ幸いです。

4

2 に答える 2

6

関数の宣言または定義で引数に名前を付けないことは完全に合法です。宣言と定義で特定の引数に異なる名前を使用することも完全に合法です。

定義で名前が付けられていないパラメーターにアクセスできない場合は注意してください。なぜこれを行うのですか?多くのコンパイラは、未使用の引数について不平を言うことができます。関数定義がこれらの未使用の引数に名前を付けていない場合、ほとんどのコンパイラは文句を言いません。

この質問のトピックである宣言内の名前のないパラメーターについて:これを行うことが合法であるからといって、必ずしもそれが良い習慣であるとは限りません。関数宣言内の名前のない引数は、コンパイラにとっては問題ないかもしれませんが、人間の読者にとっては問題ありません。名前がない=コミュニケーションゼロ。ドキュメントとヘッダー ファイルには、クラスの使用方法に関して外部ユーザーが知る必要があるすべての情報が含まれている必要があります。RTFM とおそらく RTFH (詳細なマニュアルを読む/詳細なヘッダーを読む)。RTFM と RTFH の "F" という単語 ("fine") は、RTFC では別の意味を持ちます。

ヘッダー内のこれらの名前のない引数は、ほとんど必然的に貧弱なドキュメントと結びついています。これにより、外部ユーザーとして、関数の使用方法を理解するために関数の定義を読む必要があります。RTFC。何が起こっているのかを判断するために、外部ユーザーが実装を読まなければならない場合は良くありません。

于 2012-10-13T23:55:32.297 に答える
1

つまり、パラメーターを渡さずに呼び出すと、パラメーターは渡された値を取ります。

だから電話したら

IntSet* i = new Intset();

を呼び出すことと同等です

Intset* i = new IntSet(-1,-1,-1,-1)

名前のない部分について。テンプレートを使用するライブラリの一部であるためだと思います。名前のないパラメーターは使用されませんが、それらを必要とする可能性のある別のクラスの署名と一致するように存在します。それらが必要な場合は、デフォルトで -1 を渡します。例として、次のリンクをご覧ください。

http://compgroups.net/comp.lang.c++/unnamed-formal-parameter/1004784

上記のリファレンスから例をコピーして、そのような構成を有用な方法で使用するケースを作成します。

例えば

class A
{
     public:
     A(void* = 0) {}    // unused parameter
};

class B
{
    public:
    B(void* p) : pp(p) {} // used parameter
private:
    void* pp;
};

template <class T>
class C
{
public:
    static T* create(void* p = 0) { return new T(p); }
};

int main()
{
    A* a = C<A>::create();
    B* b = C<B>::create("hello");
}

C::create は、A::A が使用されていなくてもパラメーターを持たない限りコンパイルされません。

于 2012-10-13T23:26:14.467 に答える