4

「C++入門書」の第16章の終わりに向かって、次のコードに遭遇しました(一連の行を削除しました)。

class Sales_item {
public:
    // default constructor: unbound handle
    Sales_item(): h() { }
private:
    Handle<Item_base> h;   // use-counted handle
};

私の問題はSales_item(): h() { }回線にあります。

完全を期すために、私の質問に関連すると思われるHandleクラステンプレートの部分も引用します(Item_baseクラスを表示する必要はないと思います)。

template <class T> class Handle {
public:
    // unbound handle
    Handle(T *p = 0): ptr(p), use(new size_t(1)) { }
private:
    T* ptr;          // shared object
    size_t *use;     // count of how many Handles point to *ptr
};

私は次のようなものを期待していました:

a)Sales_item(): h(0) { }これは、著者が前の章で繰り返し使用した規則です。

b)Handle<Item_base>()Handleクラスのデフォルトコンストラクターを呼び出すことが意図されている場合。

代わりに、本が持っているのはですSales_item(): h() { }。私の直感的な反応は、h()が関数宣言に疑わしいほど似ているため、これはタイプミスであるということです。一方、g ++でコンパイルして、このクラスを使用するサンプルコードを実行してみたところ、正しく機能しているようです。何かご意見は?

編集:すべての良い答え、ありがとう!その間に30分間、同じ本の第12章から関連する引用を追跡しました。「クラス型のメンバーを初期化するとき、そのメンバーの型のコンストラクターの1つに渡される引数を指定しています。使用できます。そのタイプのコンストラクターのいずれか。」そして、皆さんが指摘したように、この場合、ゼロの引数を渡します。

4

3 に答える 3

6

あなたが持っているSales_item(): h() { }のは、データメンバーの初期化を伴うコンストラクターです。

私は次のようなものを期待していたでしょう:

a)Sales_item(): h(0) { }これは、著者が以前の章で繰り返し使用した慣習です。

Handle<Item_base>()のコンストラクターは引数なしで呼び出すことができるため、これは必要ありません。(1 つの引数にはデフォルト値があるため、省略できます。)

b) Handle<Item_base>()Handle クラスのデフォルトのコンストラクターを呼び出すことが意図されていた場合。

これは単純に間違った構文です。その構文は基本クラスに使用され、どのクラスも から 1 回しか継承できないため、問題ありませんHandle<Item_base>()。ただし、その型の多くのデータ要素を持つことができるため、正しいデータ メンバーを初期化するために、型ではなく名前が使用されます。


ところで、それはあなたが学んでいる非常に良い本です。読み終わったら、The Definitive C++ Guide and Listを参照して、より適切な情報を得ることができます。

于 2010-05-17T07:48:10.947 に答える
2

コードは完全に正しいです。h() は、デフォルトのコンストラクターを使用して h を構築することを意味します。この場合、明示的な初期化を指定しないとデフォルトのコンストラクターが使用されるため、これも不要です。デフォルト コンストラクターは、引数なしで呼び出すことができる任意のコンストラクターであり、デフォルトの引数値により、ハンドル クラスが持っています。

于 2010-05-17T07:48:42.833 に答える
1

hのメンバー変数の名前でありSales_item、そのクラスHandleには既定のパラメーターを持つコンストラクターがあるためh()、メンバーを適切に構築します。と同等h(0)です。

于 2010-05-17T07:48:39.927 に答える