これは初心者向けのやや圧縮された例ですが、良い質問をしています。
1) t_data と t_name は、コンストラクターに渡されるパラメーターです。このクラスのインスタンスを作成するときは、次のようにします。
MyClass * myNewClassInstance = new MyClass("My name", &myData);
これで、コンストラクターは "My name" (std::string 形式) を t_name として持ち、myData へのポインターを t_data として持ちます。
2)ここでのコロンは、派生クラスを参照していません。 ここでは、「初期化リスト」が続くことを示しています。Prashant の回答のリンクを確認するか、これについて少し掘り下げてください。基本的に、これはメンバー変数name
をt_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;
}
上記のバージョンはまったく同じことを行います (イニシャライザ リストとコンストラクタでの従来の初期化との微妙な違いはありますが、おそらくまだ気にする必要はありません。興味がある場合は、これに関する他の参考文献を参照してください)。
これがより多くのスペースを占有することは明らかであり、それがまさに、より圧縮された形式がよく使用される理由です。しかし、あなたが始めたばかりのときは、このようにすることで物事がより明確になります. 関数(つまり、コンストラクター)に関しては、宣言と定義の違いを理解することが重要です。投稿した例では、それらが分離されていることが多いときに同時に両方を実行するためです。