0

誰かがC++クラステンプレートからの次のスニペットの構文を説明してもらえますか?

public:
explicit Foo(size_t ratio = 500)
    :list(Bar<I>())
    ,vec(Bar<iterator>())
    ,n(0), r(ratio){}

私はプログラミングの経験があり、ほとんどの概念を理解していますが、この背後にある構文は私にとって非常になじみがなく、理解できません。Iジェネリックタイプです。具体的には、ここで明示的に何をしているのか、またFoo<int> myfoo;.

ありがとう!

4

3 に答える 3

4

このexplicitキーワードは、 type の値でコピー初期化されたときに暗黙的な変換を実行するために、コンストラクターがユーザー定義の変換シーケンスの一部として選択されないようにしますsize_t

explicitたとえば、キーワードがなければ、次のすべてが有効になります。

Foo<int> bar(Foo<int> f) 
{ 
    return 0; // OK
}

Foo<int> f = 1729; // OK
bar(42); // OK

コンストラクターを として宣言するとexplicit、上記の初期化がコンパイルされなくなります。


コンストラクターの署名に続くのは初期化リストであり、コンストラクターの本体が入力される前に、クラスの基本クラス サブオブジェクトとデータ メンバー サブオブジェクトを構築するために使用されます。

初期化リストを使用しない場合、クラスのデータ メンバーはデフォルトで構築されます。constただし、クラスにデータ メンバー、参照型のデータ メンバー、または既定のコンストラクターを持たないクラス型のデータ メンバーがある場合、これはオプションではない可能性があります。

于 2013-03-28T21:16:00.597 に答える
1

これは class のコンストラクタですが、Fooすでにご存知だと思います。

explicitは、このコンストラクターが の引数を受け取る必要があることを示していますsize_t。つまり、暗黙的に型にキャストされるものsize_t(例: int) を渡すことはできません。

残りのものはコンストラクターの一部ですinitializer list。つまり、コンストラクターはデータメンバーlistBar<I>()などで初期化します。

于 2013-03-28T21:15:48.970 に答える
0

のコンストラクタの定義ですFoo。コンストラクターは ですexplicit。つまり、暗黙的な変換には関与しません。例として、次のことを考慮してください。

void bar(Foo);
bar(10); // Error - would require an implicit conversion

コンストラクターを としてマークするとexplicit、そのような変換が防止されます。

の後のすべて:は、メンバーの初期化リストです。のメンバーをFoo名前でリストし、括弧にはそれらを初期化する式が含まれています。たとえば、listによって作成された一時オブジェクトで初期化されBar<I>()nで初期化されます0

于 2013-03-28T21:17:05.897 に答える