2012-03-23 5 views
2
#include <iostream> 
using namespace std; 

class A { 
public: 
    A() { 
     cout << "Default Ctor" << endl; 
    } 
}; 

int main() { 
    A(); // <------- Problem 

    return 0; 
} 

デフォルトのCtorがコンソールに表示されます。私の質問C++クラスのインスタンス化の理論

  • は有効ですか?
  • もし私が新しいまたは任意のオブジェクトを使用しなかったので、どのようにインスタンス化しましたか?
+0

何かをインスタンス化しないと、 'A();'はどうなると思いますか? – Mat

+0

@Matええ、** new **なし、それは私の疑問です – Dewsworld

答えて

7

です。A()で新しいオブジェクトを作成します。

有効ですか?

はいです。

もしそうなら、私は新しいオブジェクトやオブジェクトを使用しなかったので、どのようにインスタンス化しましたか?

newは、ダイナミックメモリにオブジェクトを作成するだけです。オブジェクトを自動メモリに作成しています。また、オブジェクトに名前を付けなかったからといって、オブジェクトが作成されているわけではありません。この

思う:

int foo() { return 1; } 

int main() 
{ 
    foo(); 
} 

脇最適化を残しfoo()は、実際に1を返していましたか?はい、そうでした。あなたはそれを使用していないだけです。

EDIT:

のは少しそれを打破してみましょう:

A(); //creates a temporary unnamed object in automatic storage 

A a; //creates an object a of type A in automatic storage 

A a(); //creates no object, but declare a function a returning A and taking no parameters 

A a(A()); //these two are equivalent 
A a = A(); //creates a temporary unnamed object and creates an object a in automatic storage 
      //using the compiler-generated copy constructor 

A a; 
a = A(); //creates an object a in automatic storage 
      //creates an unnamed temporary object and uses the compiler-generated assignment operator 
      //to assign it to a 

A a = &A(); //invalid, &A() is the address of a temporary a, which is illegal 
+1

それはなぜ有効ではないですか?** A * object =&A()** – Dewsworld

+0

@Dewsworld有効な構文は 'A object = A() '。 –

+1

@Dewsworld私は私の答えをさらに解説して編集しました。 –

3

が有効であるされていますか?
はい、有効です

正確にはどうなりますか?

A(); 

そのデフォルト引数なしのコンストラクタを呼び出すことによって、タイプAを一時的に無名のオブジェクトを作成しますが、オブジェクトは、次の文があるため実行された時点で破壊されます。

もしそうなら、私は新しいオブジェクトやオブジェクトを使用しなかったので、どのようにインスタンス化しましたか?
オブジェクトは、用途に応じてローカル/自動ストレージまたはダイナミックストレージに作成できます。

newを使用すると、ダイナミックストレージ(ヒープ)上にオブジェクトが作成されます。オブジェクトはローカル/自動ストレージ(スタック)上に作成されたとおりに作成されます。

のでnewを使用することでのみオブジェクトが作成されますないか作成されますを決定します。

テンポラリネームレスオブジェクトとは何ですか?
オブジェクトをインスタンス化するために必ずオブジェクトの名前を付ける必要はありません。
Ex:
オブジェクトを値渡しすると、オブジェクトを値渡しすると、一時的な名前のないオブジェクトが作成され、自動的にすべて破棄されます。これらのオブジェクトは名前がなく、プログラムでは明示的に参照できませんが、それらが作成された目的を果たしてください。

簡単に言えば、
ステートメントの実行が完了すると存在しない名前のない一時オブジェクトをローカル/自動ストレージに作成しています。

+0

これが可能だった場合、私はあなたに両方を受け入れるでしょう! :) – Dewsworld

+0

@Dewsworld:受け入れるダニは、あなたが理解し、最良の方法で問題を解決するのに役立つ答えのために予約する必要があります。 –

関連する問題