このようにC ++でも同じものを使用できます[...]コンストラクターは必須です。このチュートリアルから、コンストラクターを必要としない [...] ようなオブジェクトを作成できることがわかりました。
これは間違っています。オブジェクトを作成するには、コンストラクターが存在する必要があります。コンストラクターは、何も指定しない場合、いくつかの条件下でコンパイラーによって暗黙的に定義される可能性がありますが、オブジェクトをインスタンス化する場合は、最終的にコンストラクターが存在する必要があります。実際、オブジェクトの有効期間は、コンストラクター ルーチンが戻ったときに始まるように定義されています。
C++11 標準のパラグラフ 3.8/1 から:
[...] T 型のオブジェクトの有効期間は、次の時点で始まります。
— 型 T の適切なアラインメントとサイズのストレージが取得されます。
— オブジェクトに重要な初期化がある場合、その初期化は完了しています。
したがって、コンストラクターが存在する必要があります。
1)クラスオブジェクトを作成する両方の方法の違いは何ですか?
次のように、自動ストレージ期間でオブジェクトをインスタンス化する場合(X
クラスはどこにありますか):
X x;
スコープ外になると自動的に破棄されるオブジェクトを作成しています。一方、次の場合:
X* x = new X();
オブジェクトを動的に作成し、そのアドレスをポインターにバインドしています。このようにして、作成したオブジェクトは、ポインターがスコープ外に出たときに破棄されません。x
現代の C++ では、これは疑わしいプログラミング プラクティスと見なされています。ポインターは参照セマンティクスを実現できるため重要ですが、生のポインターは、メモリ リーク (オブジェクトがすべてのポインターよりも長く存続し、破棄されることはありません) またはダングリングを引き起こす可能性があるため、不適切です。ポインター (ポインターが指すオブジェクトよりも長生きし、逆参照されると未定義の動作を引き起こす可能性があります)。
実際、 でオブジェクトを作成するときはnew
、常にで破棄することを覚えておく必要がありdelete
ます。
delete x;
参照セマンティクスが必要であり、ポインターを使用せざるを得ない場合、C++11では代わりにスマート ポインターの使用を検討する必要があります。
std::shared_ptr<X> x = std::make_shared<X>();
スマート ポインターはメモリ管理の問題を処理します。これが生のポインターで頭痛の種になる原因です。実際、スマート ポインターは、 Java または C# のオブジェクト参照とほとんど同じです。プログラマーは、スマート ポインターを所有することによって循環依存関係を導入しないように注意する必要があるため、「ほぼ」が必要です。
2)例のようなオブジェクトを作成している場合; シングルトンクラスでそれを使用する方法。
次のようなことができます (簡略化されたコード):
struct Example
{
static Example& instance()
{
static Example example;
return example;
}
private:
Example() { }
Example(Example const&) = delete;
Example(Example&&) = delete;
Example& operator = (Example const&) = delete;
Example& operator = (Example&&) = delete;
};