MQL5 コンパイラはクラスとそのポインタを区別しない - ページ 4

 

とうぜんのことながら

    a =b;
    b =a;
 
SemenTalonov:

が等価であること。

その属性は完全に忘れてください。

 
Dmitry Fedoseev:

この課題は完全に忘れてください。

だから、忘れるべきは私ではなく、そのような書き方を許さない コンパイラの方なのです。

そして、現時点では、コンパイルだけでなく、エラーもなく実行されているのです

 
SemenTalonov:

だから、忘れるべきは私ではなく、そのような書き方を許さない コンパイラの方なのです。

そして、現時点では、コンパイルだけでなく、エラーもなく実行されているのです

コンパイラは、自分が何をやっているのか分かっていれば、それができるからです。

 
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;

 
Vladimir Simakov:

実行し、コンストラクタとデストラクタが何回、いつ呼び出されるかを確認する。

m_A[0]=a;この場合、次のように等しくなります: m_A[0].iValue=a.iValue;

この例の2行目は不正確です

m_A[1] = new A();

ポインターをオブジェクトに保存することはできません。コンパイラが気づかないだけです。

 
SemenTalonov:

この例の2行目は正しくありません

ポインターをオブジェクトに保存することはできません。そして、コンパイラはそれに気づかない。

私の投稿をもう一度読んでみてください。
 
Vladimir Simakov:

実行し、コンストラクタとデストラクタが何回、いつ呼び出されるかを確認する。

m_A[0]=a;この場合、次のように等しくなります: m_A[0].iValue=a.iValue;

new A()は、この場合、新しいオブジェクトを作成し、それをtempと呼ぶことにすると、次のようになります: m_A[1].iValue=temp.iValue;

おそらくコンストラクタ3、デストラクタ2でしょう。あとは正解です。

 
Vladimir Simakov:

となり、以下のようになります。 m_A[1].iValue=temp.iValue;

これが4回目の解釈です!))

では、なぜ出力でdeleteを呼び出す必要があるのでしょうか?テンポラリーなオブジェクトのために?

 
SemenTalonov:

これが4回目の解釈です!))

では、なぜ出力はdeleteを呼び出す必要があるのでしょうか?テンポラリーなオブジェクトのために?

全く呼べない。純粋なメモリリーク。