0

私は C++ の初心者で、例を見て学習しようとしています。意味を完全には理解していないクラスの定義例を次に示します。

class MyClass{
public:
  std::string name;
  void *data;

  MyClass(const std::string& t_name, void *t_data) : name(t_name), data(t_data) {}
};

これが私が理解していることです。 name と *data はクラスの変数であり、 MyClass(...) はコンストラクターです。: の意味は、左側のクラスが右側のクラスから派生したことです。ただし、コードのこの部分の意味は何ですか。

MyClass(const std::string& t_name, void *t_data) : name(t_name), data(t_data) {}

質問は次のとおりです。

  1. 「t_data」と「t_name」とは何ですか? 「データ」と「名前」は初期値ですか?ここで t_ が使用される理由は何ですか?
  2. 上記の行の : の意味は何ですか?
  3. その行の末尾にある {} は何ですか?

助けてくれてありがとう。TJ

4

5 に答える 5

5

「t_data」と「t_name」とは何ですか? 「データ」と「名前」は初期値ですか?

これらは、コンストラクターに渡される引数です。オブジェクトが次のように作成された場合

MyClass thing("Fred", some_pointer);

次に、コンストラクターで、t_nameの値"Fred"t_data持ち、 の値を持ちますsome_pointer

ここで t_ が使用される理由は何ですか?

引数にタグを付けて、クラス メンバーに別の名前を付けるのが好きな人もいますが、必要でない限り、その必要はありません。

上記の行の : の意味は何ですか?

これは、クラス メンバー変数を初期化する初期化リストの開始を示します。次の初期化子name(t_name), data(t_data)は、コンストラクターの引数でこれらのメンバーを初期化します。

その行の末尾にある {} は何ですか?

それは、関数本体のようなコンストラクターの本体です。メンバーが初期化された後に、それらのコードが実行されます。この場合、他に何もすることがないので、本体は空です。

于 2012-07-12T17:56:03.940 に答える
4

メンバーを初期化するために初期化子リストを使用することは、C++ の良い習慣です。

  1. t_name、t_data はパラメータ名です。
    • "t_" プレフィックスは、同様の名前のメンバー フィールドと区別するために使用されるだけです。
    • 関数呼び出しに似た構文を使用してメンバーが初期化されていますが、適切な初期化/構築であるため、そのように考える必要があります。
  2. コロンは初期化子リストの開始を示します
  3. 空の中かっこ {} は、コンストラクターの本体 (メンバーが初期化された後に発生します) が空であることを示します。
于 2012-07-12T17:50:46.347 に答える
2

MyClass(const std::string& t_name, void *t_data) : 名前(t_name), データ(t_data) {}

クラスのコンストラクタであり、文字列と void* パラメータでクラスを初期化する必要があります。次に、渡されたパラメータでクラス フィールド (名前とデータ) を初期化します。

于 2012-07-12T17:55:24.033 に答える
0

これは初心者向けのやや圧縮された例ですが、良い質問をしています。

1) t_data と t_name は、コンストラクターに渡されるパラメーターです。このクラスのインスタンスを作成するときは、次のようにします。

MyClass * myNewClassInstance = new MyClass("My name", &myData);

これで、コンストラクターは "My name" (std::string 形式) を t_name として持ち、myData へのポインターを t_data として持ちます。

2)ここでのコロンは、派生クラスを参照していません。 ここでは、「初期化リスト」が続くことを示しています。Prashant の回答のリンクを確認するか、これについて少し掘り下げてください。基本的に、これはメンバー変数namet_name(上記の例でコンストラクターに渡した std::string) および(void ポインター) にdata設定します。t_data(以下の追加の注記を参照)

3) {} は、コンストラクターの実際の定義です。空です -- ここにはコードはありません。したがって、コンストラクターが行うことは、(初期化リストで定義されているように) メンバー変数を初期化することだけであり、それ以上のことはありません。

次に、まったく同じクラスをより初心者向けの形式で見てみましょう。

// The declaration of MyClass.  This would often show up in a header (.h) file
class MyClass {
public:
  // Member variables
  std::string name;
  void * data;

  // Declaration of constructor -- we haven't defined what actually does here, just
  // what parameters it takes in.
  MyClass(const std::string& t_name, void * t_data);
}

// We declared what the class "looks like" above, but we still have to define what
// the constructor does.  This would usually show up in a .cpp file

// This is the constructor definition.  We have to specify that it's part of the
// The extra "MyClass::" specifies that it's part of the MyClass namespace that we
// declared above.
MyClass::MyClass(const std::string& t_name, void * t_data)
{
  // Set our member variables to what was passed in.
  this.name = t_name;
  this.data = t_data;
}

上記のバージョンはまったく同じことを行います (イニシャライザ リストとコンストラクタでの従来の初期化との微妙な違いはありますが、おそらくまだ気にする必要はありません。興味がある場合は、これに関する他の参考文献を参照してください)。

これがより多くのスペースを占有することは明らかであり、それがまさに、より圧縮された形式がよく使用される理由です。しかし、あなたが始めたばかりのときは、このようにすることで物事がより明確になります. 関数(つまり、コンストラクター)に関しては、宣言と定義の違いを理解することが重要です。投稿した例では、それらが分離されていることが多いときに同時に両方を実行するためです。

于 2012-07-12T18:22:26.803 に答える
0

私は C++ の初心者で、例を見て学習しようとしています。

何らかの理由で、C++ でこれを行うのは、Perl、Python、Java、さらには C よりも困難です。このコースはお勧めしません。代わりに、良い本に投資するかもしれません。

これが私が理解していることです:

それから始めましょう。あなたが主張しているほど、あなたは理解していないと思います。

name と *data はクラスの変数です

No.namedataはクラスの変数です。それらのタイプは、それぞれstd::stringおよびvoid*です。

MyClass(...) はコンストラクターです。

はい。

: の意味は、左側のクラスが右側のクラスから派生したことです。

いいえ、:異なる文脈では異なることを意味します。サンプルで使用されているコンテキストでは、初期化子リストが続くことを示します。

ただし、コードのこの部分の意味は何ですか:

「t_data」と「t_name」とは何ですか?

それらはコンストラクター関数のローカル変数です。具体的には、これらは関数に渡されるパラメーターです。

「データ」と「名前」は初期値ですか?

それが、このサンプルで使用されている方法です。具体的には、初期化子リストのdataおよび初期化子に渡されます。name

ここで t_ が使用される理由は何ですか?

これは純粋にこの特定の著者の慣習です。私は前にその大会を見たことがありません。

上記の行の : の意味は何ですか?

初期化リストを導入します。このコンストラクトは、コンストラクター メンバー関数でのみ使用されます。名前付きの各メンバーは、リストされた値によって初期化されます。(注: 値はパラメータから取得する必要はありません -- それらは任意の正当な式である可能性があるため、:は正当なMyClass(int ii) : i(ii), j(cos(0) / 2), k(&global_variable) {}コンストラクタである可能性があります。)

その行の末尾にある {} は何ですか?

コンストラクター メンバー関数の本体。コンストラクターの作業はすべて初期化リストで行われるため、関数の本体は空です。

于 2012-07-12T18:24:11.630 に答える