[解決済み] c++でクラスオブジェクトを作成する
質問内容
まず、私はJAVAから来ました。
javaでは、このようにクラスオブジェクトを作成します。
Example example=new Example();
Exampleクラスはコンストラクタを持つことができ、また持つことができない。
c++で同じように使うには、次のようにします。
Example* example=new Example();
コンストラクタが必須である場合。
このチュートリアルより http://www.cplusplus.com/doc/tutorial/classes/
このようなオブジェクトを作成できることがわかりました。
Example example;
コンストラクタを必要としないもの。
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;
};
関連
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み] Pythonで子クラスから親クラスのメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] Pythonにはクラス内に「プライベート」変数がある?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み】ES6クラス変数の代替品
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】C++ シングルトンデザインパターン