1

C++ で考えるより

コンストラクターの最初の隠し引数は this ポインターです。このポインターは、呼び出し元オブジェクトのアドレスを保持します。コンストラクターの場合、このポインターは初期化されていないメモリーブロックを指します。このメモリ ブロックを適切に初期化するのは、コンストラクタの仕事です。

つまり、基本的に、コンストラクターは RAM 内のオブジェクトのスペースへのポインターを取得するために使用されますか? あれは正しいですか?

デフォルトのコンストラクターはそのメモリをどのように初期化しますか? ゼロに初期化されますか?

4

5 に答える 5

2

デフォルト コンストラクターの役割は、他のコンストラクターと同じです。オブジェクトを初期化します。nullptrデフォルトのコンストラクター (またはデフォルトの引数のみを持つコンストラクター) は、ポインターを(または0) などに設定するなど、メンバー変数を既知の状態に設定します。

この構造があるとしましょう:

struct Foo
{
    int a;
    int* b;

    // Default constructor
    // Set `a` to `1`, and `b` to `nullptr`
    Foo() : a(1), b(nullptr) {}
};

Fooクラスのインスタンスを宣言すると、メンバー変数がどのような状態になるかがわかります。コンストラクターがない場合、クラスの通常のローカル変数インスタンスは、メンバーとメンバーFooに対して未定義の値を持ちます。ab

デフォルトまたはその他のコンストラクターをまったく提供しない場合、コンパイラーはデフォルトのコンストラクターを作成します (必要な場合、またはクラスのインスタンスを作成できません)。メンバーの初期化。

話題になっている隠し引数は、 として知られる変数でthisあり、 ではないすべてのメンバー関数に存在しますstatic

于 2013-09-12T07:07:50.917 に答える
2

つまり、基本的にコンストラクターは、R​​AM 内のオブジェクトのスペースへのポインターを取得するために使用されますか? あれは正しいですか?

いいえ、ポインターを取得するためにコンストラクターは使用されません。

コンストラクターの目的は、このクラスのオブジェクトが作成されるときにすべてのメンバー変数を初期化することです。メモリ内のオブジェクトを初期化します。

デフォルトのコンストラクターは、引数なしで呼び出すことができるコンストラクターです。

クラスを実装する場合、独自のデフォルト コンストラクターを実装して、必要な処理を行うことができます。

クラスにコンストラクターを指定しない場合、コンパイラはこのクラスの既定のコンストラクターを提供しますが、メンバーは初期化されません。

デフォルトのコンストラクターは、特定の状況で自動的に呼び出されるため、重要です。

  • MyClass x;; のように、オブジェクト値が引数リストなしで宣言されている場合。または引数リストなしで動的に割り当てられます。たとえば、new MyClass または new MyClass(); オブジェクトの初期化には、デフォルトのコンストラクターが使用されます。
  • オブジェクトの配列が宣言されている場合MyClass x[10];(動的に割り当てられている場合などnew MyClass [10];) は、デフォルトのコンストラクターを使用してすべての要素が初期化されます。
  • 派生クラス コンストラクターがその初期化子リストで基底クラス コンストラクターを明示的に呼び出さない場合、基底クラスの既定のコンストラクターが呼び出されます。
  • クラス コンストラクターが、初期化子リスト内のオブジェクト値フィールドのいずれかのコンストラクターを明示的に呼び出さない場合、フィールドのクラスの既定のコンストラクターが呼び出されます。
  • 標準ライブラリでは、特定のコンテナーは、値が明示的に指定されていない場合に、既定のコンストラクターを使用して値を "入力" します。たとえばvector<MyClass>(10);、ベクターを 10 個の要素で初期化し、型の既定で構築された値で塗りつぶします。

上記の状況で、クラスにデフォルトのコンストラクターがない場合はエラーになります。

于 2013-09-12T07:09:06.320 に答える
1

いいえ。ポインターを取得するためにコンストラクターは使用されません。コンストラクターはこのポインターを受け取ります。

コンストラクターは、R​​AM 内のオブジェクトのスペースを初期化するために使用されます。

デフォルトのコンストラクターは、あなたがやりたいことをします! つまり、クラスの独自のデフォルト コンストラクターを作成できるということです。この既定のコンストラクターは、選択に応じて、メモリを初期化することも、初期化しないままにすることもできます。

同じように、暗黙のデフォルト コンストラクターはコンパイラーによって自動的に書き込まれ、オブジェクトの RAM 空間を初期化します。デフォルトのコンストラクターを持つクラスの非静的メンバー変数の初期化を処理します。たとえば、クラスにstd::stringメンバー変数として非静的がある場合、std::stringデフォルトのコンストラクターが呼び出されてこの変数が初期化されます。POD型 ( int、、ポインターchar、 ...)のすべての非静的メンバー変数は初期化されません。

于 2013-09-12T07:06:56.543 に答える
0

いいえ。

MyClass obj;                    // Default construct
MyClass* obj2 = new MyClass;    // Also default construct

obj最初のものでは、通常はスタック内のスペースが最初に割り当てられます。2 つ目はヒープに割り当てられます。それらが存在するアドレスは、これらの場合に適切なコンストラクターに渡されるものです。

最初の引数がthisポインターである状況は、既定のコンストラクターにのみ適用されるわけではありません。this非静的クラスのすべてのメソッドに最初の引数として隠しポインターが渡されるためです[1]

その後、おそらく残りを知っています。コンストラクターは、オブジェクトのメンバーと状態、および実行する必要があるその他のことをセットアップして初期化します。


[1]このような例を見たことがありますか?

my_type obj;
func_that_calls_a_callback(std::bind(&my_type::method, &obj));

これは、最初のパラメーターが の最初のパラメーターにバインドされているオブジェクトへのポインターであることを示していますmy_type::method。それが、thisこの場合は を指すポインターになりますobj

于 2013-09-12T07:08:14.813 に答える
0

つまり、基本的にコンストラクターは、R​​AM 内のオブジェクトのスペースへのポインターを取得するために使用されますか? あれは正しいですか?

いいえ、それは単なる結果です

デフォルトのコンストラクターはそのメモリをどのように初期化しますか? ゼロに初期化されますか?」

いいえ: デフォルトのコンストラクターは単なる関数です。それは、あなたが定義したことを実行します。通常、含まれている変数 (オブジェクト メンバー) に適切な値を割り当てるか、独自のコンストラクターを順番に呼び出すことによって、メモリを "初期化" するように設計されています。

これを考えてください:

class point
{
public:
   int x,y; //< just two values

   point() //< default constructor
   { x=0; y=0; } //< function body assigning values
};

また

class point
{
public:   
   int x,y; //< just two values

   point() //< default constructor
    :x(), y() //< member init-list explicitly calling contrutors
   {} //< empty body
};

タイプの変数を宣言しない限り、point何も実行されないことに注意してください。

int main()
{
   point p; //< p created and point::point() called using p as *this
   p.x=5; //< x member of p changed
   return 0; //just exit main (jumps to the closing } )
} //< p destructor called here, using p as *this.

「暗黙のデフォルトコンストラクター」に従って、それが行うことは次のとおりです。

  • ベースの暗黙的なデフォルト コンストラクタを呼び出す
  • メンバーを暗黙のデフォルト コンストラクターと呼びます。

すべてのクラスベースの型では、デフォルトの ctor を宣言すると、実際には暗黙的な ctor が置き換えられますが、「組み込み型」 (int、char、float など) の場合、デフォルトの明示的なコンストラクターは、実際には値をに設定します。ゼロですが、暗黙的なものは何もしないため、値が初期化されません。(実装では、異なる手法を使用して同じ結果を得ることができます)

于 2013-09-12T07:11:17.647 に答える