2

私は Python のバックグラウンドを持っていますが、C++ 標準ライブラリで利用可能なオブジェクトとデータ構造の種類を調べていたところ、たとえばvector文字列の宣言が次のように表示されていることがわかりました。

vector<string> names(10);

vectorタイプ のオブジェクトを 10 個保持するように初期化されたオブジェクトを示しますstring。私の質問は次のとおりです。

  • 宣言の一部には C++ クラス システムへの抽象化がありますか。<string>つまり、それはベクトル オブジェクトの組み込み構文ですか、またはユーザー定義のクラス定義で使用できるクラス システムの機能の一部ですか?
  • 名前が続く括弧がコンストラクター関数に渡される引数であると仮定するのは正しいですか?
  • string組み込み型のようなものintか、標準ライブラリで定義されたオブジェクトです。したがって、組み込み型と他のオブジェクトには違いがありますか (たとえば、すべての「型」は Python のオブジェクトです)。
4

1 に答える 1

3

std::vectorオブジェクトには 2 種類のパラメーターがあります。

  1. std::vector値の型とアロケータの型用のテンプレート引数があり、後者はデフォルトです。つまり、std::vector<std::string>実際にはたまたまstd::vector<std::string, std::allocator<std::string> >です。
  2. コンストラクター引数として渡される実行時パラメーターがありstd::vector<...>、それらのかなりの数の組み合わせを取ります。上記の使用で10は、 はベクトルに与えられた初期要素の数です。

したがって、具体的な質問に答えるには:

  1. stringたまたまそうであり、std::stringまったく特別なことではありません。特定の概念をモデル化する任意のユーザー定義型を使用できます (たとえば、型は である必要がありますCopyConstructible)。
  2. 括弧内の引数はコンストラクターの引数です (C++ コンテキストでは、括弧は通常[and]ですが、用語があいまいです)。
  3. string、まあ、実際にstd::stringは組み込み型として定義されていませんが、標準 C++ ライブラリの型です。ただし、標準の C++ ライブラリの型がどのように実装されるかは、C++ の実装次第です。つまり、実装は (クラス型のように使用できる限り) 組み込みにすることを選択できます。

C++ では、組み込み型とクラス型の間にいくつかの違いがありますが、C++ 2011 では、組み込み型のように動作するクラス型を作成できるようになりました。主な違いは、クラス型の特定のメンバーのアドレスを取得できる一方で、組み込み型では同じ「メンバー」にアクセスできないことです。もう 1 つの違いは、組み込み型は宣言する必要がない (実際には宣言できない) のに対し、クラス型は宣言および/または定義する必要がある (これらの使用方法に応じて) ことです。

于 2012-11-14T20:58:48.933 に答える