1. ホーム
  2. c++

[解決済み] c++でクラスオブジェクトを作成する

2022-03-11 09:42:09

質問内容

まず、私はJAVAから来ました。

javaでは、このようにクラスオブジェクトを作成します。

Example example=new Example();

Exampleクラスはコンストラクタを持つことができ、また持つことができない。

c++で同じように使うには、次のようにします。

Example* example=new Example();

コンストラクタが必須である場合。

このチュートリアルより http://www.cplusplus.com/doc/tutorial/classes/

このようなオブジェクトを作成できることがわかりました。

Example example;

コンストラクタを必要としないもの。

2つ質問があります。

  1. クラスオブジェクトの作成方法には、どのような違いがあるのでしょうか。

  2. のようなオブジェクトを作成する場合 Example example; シングルトン・クラスでそれをどのように使用するか。

普段からこうしているように

Sample* Singleton::get_sample() {
    if (sample == NULL) {
        sample = new Sample();
    }
    return sample;
}

間違っていたらご指導ください。

どのように解決するのですか?

<ブロッククオート

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#のオブジェクトリファレンスと同じです。このquot;almost"は、プログラマがスマートポインタを所有することによって循環的な依存関係をもたらさないように注意する必要があるためです。

<ブロッククオート

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;

};