0

私はC++を独学しています。「X」オブジェクトのコレクションであるメンバー変数のみを持つを作成している場合Class(X が何であれ)、デフォルトのコンストラクターとデコンストラクターだけで十分であり、純粋にオブジェクトのコレクションを扱っているように見えますか? ありがとう。

編集:申し訳ありませんが、より明確にする必要があります。別の例として、int、文字列、および別のクラスのオブジェクトのベクトルを持つクラス「Aclass」がある場合、「Aclass」クラスにパラメーターを持つコンストラクターを持たせるようにアドバイスしますか? つまりAclass(int i, string s);、コンストラクターにもベクターが必要ですか? 私は少し混乱しています。ありがとう。

4

5 に答える 5

1

「'x' オブジェクトのコレクション」が「'x' オブジェクトの標準コンテナ」を意味し、「十分」が「リソース管理について心配する必要がない」ことを意味する場合は、その通りです。あなたまたはサードパーティによって作成された適切に作成されたコンテナについても同じことが言えます。

これは、X オブジェクトがリソースを正しく処理していることも前提としています。そして、それらを入れるコンテナと互換性のあるセマンティクスを持っていること。

編集

オブジェクトにすべてのデフォルト値を入力しても問題ない場合は、そのようなコンストラクターは必要ありません。つまり、空のコンテナー、ゼロ化されたメンバー (または初期化されていない? -_-) などです。

オブジェクトが無効な状態になる場合、または何らかのカスタム ロジックを実行する場合にのみ、カスタム コンストラクターが本当に必要になります。

于 2012-12-08T19:57:18.820 に答える
0

メモリを正しく処理するのに十分な意味がありますか? 種類により異なりXます。たとえば、vector<string>データ メンバーがある場合、クラスで手動のメモリ管理を行う必要はありません。

于 2012-12-08T19:56:49.790 に答える
0

クラスの場合、内部オブジェクトを構築する方法を示す独自のコンストラクターを作成できます。つまり、

class A{
    string s;
    int x;
    A(string t):s(t), x(17){} // x is always 17 after construction
}

ただし、内部オブジェクトがデフォルトで構築可能な場合は、その構築をそのままにしておくことができ、デフォルトで構築されます。

A(int l):x(l){}

と同等です

A(int l):x(l), s(){}

(プリミティブ型を除く)、デフォルトでゴミが含まれている可能性があります

のデフォルト コンストラクタを使用するとA、すべての内部オブジェクトがデフォルトで構築されます。

于 2012-12-08T20:18:48.987 に答える
0

標準ライブラリ クラスを意味する場合collectionは、コピー ctor と代入 operator= オーバーロードが必要です。

std::map および std::set には、追加の比較演算子 < オーバーロードが必要です。std::unorderd_map と std::unordered_set には、タイプに特化した std::hash が必要です。

于 2012-12-08T20:24:24.780 に答える
0

多くの場合、既定のコンストラクターを定義する必要はありません。コンストラクターが必要であり、コンストラクターが定義されていない場合、コンパイラーはデフォルトのコンストラクターを暗黙的に宣言します。多くの場合、デフォルトのコンストラクターに加えて、追加のコンストラクター (言及したものなど) を定義すると便利です。その場合、両方を定義する必要があります。

class A
{
public:

    string s;
    int x;

    // default constructor, no arguments
    A(): x(), s() {}

    // constructor
    A(int i, string t): x(i), s(t) {}
}

int main()
{
    A a1;
    A a2(5, "text");
    vector<A> ls;
    return 0;
}

pwned が言及しているように、ベクトルなどの STL コンテナーでクラス A を使用するには、例のように A にデフォルトのコンストラクター (ユーザー定義または暗黙) が必要です。

于 2012-12-08T20:43:08.467 に答える