1. ホーム
  2. c++

[解決済み] クラスのインスタンスを作成する

2022-03-09 23:36:46

質問

1、2、3、4行目の違いは何ですか?

それぞれどのような場合に使用するのですか?

なぜ3行目は constructor Foo で、7行目はエラーを返し、8行目は返さないのですか?

#include <iostream>     
using namespace std;

class Foo
 {
   public:
   Foo ( )
   {
      cout << "constructor Foo\n";
   }               
};

class Bar
 {
   public:
   Bar ( Foo )
   {
      cout << "constructor Bar\n";
   }
};

int main()
{
   /* 1 */ Foo* foo1 = new Foo ();
   /* 2 */ Foo* foo2 = new Foo;
   /* 3 */ Foo foo3;
   /* 4 */ Foo foo4 = Foo::Foo();

   /* 5 */ Bar* bar1 = new Bar ( *new Foo() );
   /* 6 */ Bar* bar2 = new Bar ( *new Foo );
   /* 7 */ Bar* bar3 = new Bar ( Foo foo5 );
   /* 8 */ Bar* bar3 = new Bar ( Foo::Foo() );

   return 1;
}

解決方法は?

   /* 1 */ Foo* foo1 = new Foo ();

型のオブジェクトを作成します。 Foo を動的メモリに格納します。 foo1 がそれを指します。通常、C++では生のポインターは使わず、スマートポインターを使います。もし Foo がPOD型だった場合、これは値の初期化を行うことになります(ここでは適用されません)。

   /* 2 */ Foo* foo2 = new Foo;

という理由で、以前と同じです。 Foo はPOD型ではありません。

   /* 3 */ Foo foo3;

を作成します。 Foo というオブジェクトを作成します。 foo3 を自動保存している。

   /* 4 */ Foo foo4 = Foo::Foo();

コピー初期化を使って Foo というオブジェクトを作成します。 foo4 を自動保存している。

   /* 5 */ Bar* bar1 = new Bar ( *new Foo() );

用途 Bar の変換コンストラクタを使用して、型 Bar を動的ストレージに格納します。 bar1 はそれへのポインタである。

   /* 6 */ Bar* bar2 = new Bar ( *new Foo );

前と同じです。

   /* 7 */ Bar* bar3 = new Bar ( Foo foo5 );

これは単なる無効な構文です。そこで変数を宣言することはできません。

   /* 8 */ Bar* bar3 = new Bar ( Foo::Foo() );

があれば、5と6と同じ原理で動作し、機能する。 bar3 は7でオン宣言されていない。

5 & 6 はメモリリークを含んでいます。

のような構文です。 new Bar ( Foo::Foo() ); は普通ではありません。通常は new Bar ( (Foo()) ); - 余分な括弧は、最も苛酷な解析のためのものです。 (訂正)