2010-12-18 18 views
3

私には2つの質問があります。C++、コンストラクタの理由

1)コンストラクタは実際に何をしていますか?インスタンスを宣言するときにコンストラクタを使用しないとどうなりますか?

2)この2つの違いを教えてください。

A a(1,2) 

A *a = new A(1,2) 

+3

私は宿題のようです。 –

+1

[オブジェクトを新しいものと使わないもののインスタンス化の違いは何ですか?](http://stackoverflow.com/questions/3673998/what-is-difference-between-instantiating-an-object-using-new-vs - なし) – fredoverflow

答えて

8

コンストラクタは、クラスのメンバ変数を初期化して使用できるようにするために呼び出されます。インスタンスを宣言するときにコンストラクタを使用しない場合の結果は、コンテキストによって異なります。

あなたはそうのように、ヒープ上の変数を割り当てている場合は、次の

A *a; 

aは、NULLまたは0に割り当てられるまで、メモリ内のランダムなアドレスを指す、またはの既存または新規のインスタンスになりますクラス、例えば:

A *a = new A(1, 2); 

あなたは、スタック上の変数を割り当てている場合は、次の構文が使用されます。

A a(1, 2); // if parameters are used 
A a; // if no parameters are used 

上記の両方とも、クラスAのコンストラクタを呼び出し、そのインスタンスをスタックに割り当てます。最初の例ではAのインスタンスがスタックに割り当てられ、2番目のインスタンスではヒープにAのインスタンスが割り当てられます。

3

コンストラクタは、クラスと同じ名前の関数です。コンストラクタの主な目的は、新しく作成されたオブジェクトのメンバ変数をいくつかのデフォルト値に初期化することです。また、他の初期化関数を呼び出すこともあります。
C++の他の関数と同様に、コンストラクタはオーバーロードすることができます。 (オーバーロードされた関数は、引数の異なる既存の関数の新しいバージョンです)。例えば、3つのコンストラクタと以下Pointクラスを考える:第二は、ユーザがデフォルト値を指定することを可能にしながら

class Point 
{ 
public: 
    Point() : x_(0), y_(0) { } 
    Point(int x, int y) : x_(x), y_(y) { } 
    Point(const Point& p) : x_(p.x), y_(p.y) { } 
private: 
    int x_; 
    int y_; 
}; 

最初のコンストラクタは、ゼロに座標を初期化:

void create_and_destroy_points() 
{ 
    Point p1; // => x_ = 0, y_ = 0 
    Point p2(100, 200); // x_ = 100, y_ = 200 
} 

そのように宣言すると、Pointオブジェクトはスタックに割り当てられます。つまり、割り当てられたメモリは、create_and_destroy_points関数が返ってくると自動的に解放されます。言い換えれば、p1p2は機能外では使用できません。
オブジェクトをヒープに割り当てることもできます。これにより、実行時にオブジェクトが割り当てられ、さまざまな関数呼び出しで存続することができます。それらはnewキーワードで割り当てられ、deleteで割り当てが解除されるまで存続します。使用後にヒープ割り当てオブジェクトを削除できないと、メモリリークが発生します。

Point* create_point() 
{ 
    Point* p = new Point(100, 200); 
    return p; 
} 

Point* p = create_point(); 
// use p 
delete p; 

第三のコンストラクタは、コピーコンストラクタあります。

Point p1; 
Point p2 = p1; // calls the copy constructor for p2 with p1 as argument. 
Point p3(p1); // alternate syntax 
2

#2に答えるには、最初の例ではA型の変数 'a'をスタックに割り当てますが、2番目の型はA型にポインタ '* a'を割り当てます。ポインタには開始値、アドレスダイナミックメモリを指しています。どちらの場合でも、A :: A()コンストラクタは2つのパラメータを取ると呼ばれます

2

1)コンストラクタは実際に何をしていますか?

オブジェクトの構築は、2つの部分からなる:

  1. 何が起こるかコンストラクタのコードのメモリ

  2. 実行

の必要量を割り当てます コンストラクタを使用しない場合 インスタンスを宣言していますか?

コンストラクタは、明示的に呼び出さなくても常に実行されます。例:

std::string a; 

ここで、文字列クラスのデフォルトコンストラクタが呼び出されます。

2)これらの2つの違いは、 ですか?

A a(1, 2); 

このコードは、ユーザ定義のコンストラクタを呼び出します。

A a; 

このコードはデフォルトのコンストラクタを呼び出します。

2

1)コンストラクタは、メンバ変数の初期化のためだけに使用する必要があります。上記クラスにおいて

class A { 
public: 
    A() { a = 0; b = 0; } 
    A(int a, int b) { this->a = a; this->b = b; } 

private: 
    int a; 
    int b; 
}; 

、我々は、各メンバ変数、ゼロのと指定された引数を有する他のものを初期化し、2つのコンストラクタを有します。

クラスには、任意の数のコンストラクタを含めることができます。クラスのインスタンスを作成するときは、必ずたとえば、それらのいずれかを呼び出す必要があります:

A a1; // uses first constructor, i.e. A::A() 
A a2(); // also uses first constructor 

A* a3 = new A(1, 2); // uses second constructor, i.e. A::A(int a, int b) 
A a4(1, 2);   // also uses second constructor 

2)宣言:

A a(1, 2) 

は、インスタンスが自動的になることを意味する範囲、にバインドされたインスタンスを保持する変数を宣言しますプログラムがそのスコープを終了するときに削除されます。我々はその機能を終了するときに自動的に削除されます構成された関数インスタンスaの物乞いで

void fn() { 
    A a(1, 2); 
    ... 
    ... 
} 

:たとえば。以下の場合

A *a = new A(1,2) 

変数aを宣言し、それが持つポイントは、しかし、あなたのインスタンスは生き残ることができ、「削除」されには、手動でインスタンスを削除しなければならないA.の新しく作成されたインスタンスを指していますaが宣言されているスコープ例:

ここで、関数fnは、その本体の内部に作成されたインスタンス、つまりインスタンスが関数スコープに残っているインスタンスを返します。

関連する問題