MQL5 コンパイラはクラスとそのポインタを区別しない - ページ 4 1234567891011...13 新しいコメント SemenTalonov 2019.01.10 08:43 #31 とうぜんのことながら a =b; b =a; Dmitry Fedoseev 2019.01.10 08:44 #32 SemenTalonov:が等価であること。 その属性は完全に忘れてください。 SemenTalonov 2019.01.10 08:54 #33 Dmitry Fedoseev:この課題は完全に忘れてください。だから、忘れるべきは私ではなく、そのような書き方を許さない コンパイラの方なのです。 そして、現時点では、コンパイルだけでなく、エラーもなく実行されているのです Dmitry Fedoseev 2019.01.10 08:59 #34 SemenTalonov:だから、忘れるべきは私ではなく、そのような書き方を許さない コンパイラの方なのです。 そして、現時点では、コンパイルだけでなく、エラーもなく実行されているのですコンパイラは、自分が何をやっているのか分かっていれば、それができるからです。 Vladimir Simakov 2019.01.10 09:00 #35 class A { public: int iValue; A(){Print("++");} ~A(){Print("--");} }; //...................... A m_A[2]; void OnStart() { A a; m_A[0] =a; m_A[1] = new A(); }実行し、コンストラクタとデストラクタが何回、いつ呼び出されるかを確認する。 m_A[0]=a;この場合、次のように等しくなります: m_A[0].iValue=a.iValue; new A()は、この場合、新しいオブジェクトを作成し、それをtempと呼ぶことにすると、次のようになります: m_A[1].iValue=temp.iValue; SemenTalonov 2019.01.10 09:05 #36 Vladimir Simakov:実行し、コンストラクタとデストラクタが何回、いつ呼び出されるかを確認する。 m_A[0]=a;この場合、次のように等しくなります: m_A[0].iValue=a.iValue;この例の2行目は不正確です m_A[1] = new A(); ポインターをオブジェクトに保存することはできません。コンパイラが気づかないだけです。 Vladimir Simakov 2019.01.10 09:06 #37 SemenTalonov:この例の2行目は正しくありません ポインターをオブジェクトに保存することはできません。そして、コンパイラはそれに気づかない。 私の投稿をもう一度読んでみてください。 Dmitry Fedoseev 2019.01.10 09:08 #38 Vladimir Simakov:実行し、コンストラクタとデストラクタが何回、いつ呼び出されるかを確認する。 m_A[0]=a;この場合、次のように等しくなります: m_A[0].iValue=a.iValue; new A()は、この場合、新しいオブジェクトを作成し、それをtempと呼ぶことにすると、次のようになります: m_A[1].iValue=temp.iValue;おそらくコンストラクタ3、デストラクタ2でしょう。あとは正解です。 SemenTalonov 2019.01.10 09:10 #39 Vladimir Simakov:となり、以下のようになります。 m_A[1].iValue=temp.iValue;これが4回目の解釈です!)) では、なぜ出力でdeleteを呼び出す必要があるのでしょうか?テンポラリーなオブジェクトのために? Vladimir Simakov 2019.01.10 09:13 #40 SemenTalonov:これが4回目の解釈です!)) では、なぜ出力はdeleteを呼び出す必要があるのでしょうか?テンポラリーなオブジェクトのために? 全く呼べない。純粋なメモリリーク。 1234567891011...13 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
とうぜんのことながら
が等価であること。
その属性は完全に忘れてください。
この課題は完全に忘れてください。
だから、忘れるべきは私ではなく、そのような書き方を許さない コンパイラの方なのです。
そして、現時点では、コンパイルだけでなく、エラーもなく実行されているのです
だから、忘れるべきは私ではなく、そのような書き方を許さない コンパイラの方なのです。
そして、現時点では、コンパイルだけでなく、エラーもなく実行されているのです
コンパイラは、自分が何をやっているのか分かっていれば、それができるからです。
class A { public: int iValue; A(){Print("++");} ~A(){Print("--");} }; //...................... A m_A[2]; void OnStart() { A a; m_A[0] =a; m_A[1] = new A(); }
実行し、コンストラクタとデストラクタが何回、いつ呼び出されるかを確認する。
m_A[0]=a;この場合、次のように等しくなります: m_A[0].iValue=a.iValue;
new A()は、この場合、新しいオブジェクトを作成し、それをtempと呼ぶことにすると、次のようになります: m_A[1].iValue=temp.iValue;
実行し、コンストラクタとデストラクタが何回、いつ呼び出されるかを確認する。
m_A[0]=a;この場合、次のように等しくなります: m_A[0].iValue=a.iValue;
この例の2行目は不正確です
ポインターをオブジェクトに保存することはできません。コンパイラが気づかないだけです。
この例の2行目は正しくありません
ポインターをオブジェクトに保存することはできません。そして、コンパイラはそれに気づかない。
実行し、コンストラクタとデストラクタが何回、いつ呼び出されるかを確認する。
m_A[0]=a;この場合、次のように等しくなります: m_A[0].iValue=a.iValue;
new A()は、この場合、新しいオブジェクトを作成し、それをtempと呼ぶことにすると、次のようになります: m_A[1].iValue=temp.iValue;
おそらくコンストラクタ3、デストラクタ2でしょう。あとは正解です。
となり、以下のようになります。 m_A[1].iValue=temp.iValue;
これが4回目の解釈です!))
では、なぜ出力でdeleteを呼び出す必要があるのでしょうか?テンポラリーなオブジェクトのために?
これが4回目の解釈です!))
では、なぜ出力はdeleteを呼び出す必要があるのでしょうか?テンポラリーなオブジェクトのために?