最初のものは2番目のものと同じではありません。
この特定のケースでは、おそらく同じ結果が得られます。ただし、Pointは簡単に代入演算子を実装し、new Point
「異なる」何かを実行できます(私は本を持っていないので、すべての詳細を知りません)。同様に、代入演算子は期待どおりのことを行う必要があります...ただし、thePointは、 vsを使用した場合に(何らかの奇妙な理由で)異なる動作をする可能性のあるコンテナー(スマートポインターなど)である可能性があります。initialization(Point)
default initialization followed by assignment
この場合、これらの詳細は重要ではない可能性がありますが、初期化の順序と実行に影響します。プログラムが成長するとき、違いは重要になります。そのとき、初期化には時間がかかります。オブジェクトが正しく初期化されていること、つまり、オブジェクトが適切に(最初に)構築され、正しい順序で構築されていることを確認する必要があります。最も明白なケース:デフォルトのコンストラクターがパラメーターを持つコンストラクターとは異なる動作をする場合、特にコンストラクターが割り当てを生成する場合、またはその他の時間のかかる(または動作が異なる)副作用がある場合に違いが生じます。
そして、これをコンストラクターで行っているので、intxとintyに割り当てられた値は何ですか?
それは完全にPoint
のコンストラクタに依存します。
xとyの値を新しいPoint(x、y)に書き込む必要がありますか?または、それはそのように正しいですか?
(ほとんどのチームにとって)推奨される方法は、可能な限り初期化リストと正式なコンストラクターを使用し、正しい初期化をサポートするように型を作成することです。コードベースが大きくなると、微妙なことがたくさん出てきます。このコンストラクターは初期化リストを使用します。
HeapPoint::HeapPoint(int x, int y): thePoint(new Point(x,y)) { }
次のようにthePointを宣言する場合は、仮想的なケースで適切な初期化が必要になる可能性があります。
const Point* const thePoint;
1つ目const
は、ポイントを変更できないことを意味します(たとえば、Point.x
またはPoint.y
)。2番目の定数は、変数に新しい割り当てを割り当てることができないことを意味します。OPの例の簡単な例ですが、プログラムが成長するにつれて間違いなく役立ちます。