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。

这个例子中的第二行是不正确的

m_A[1] = new A();

你不能将一个指针保存到一个对象中。编译器只是没有注意到这一点。

 
SemenTalonov:

这个例子中的第二行是不正确的

你不能将一个指针保存到一个对象中。而编译器并没有注意到这一点。

再读一下我的帖子。
 
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种解释!))。

那么为什么有必要在输出中调用删除?对于一个临时性的对象?

 
SemenTalonov:

这是第4种解释!))。

那么为什么输出需要调用删除?对于一个临时性的对象?

你根本就不能叫它。纯粹的内存泄漏。