方法声明后的const修饰符意味着什么?

 

私下里问了一个问题,这是什么意思。我在论坛上找到一个有用的例子,有助于澄清。
顺便说一下,如果你会说英语,用英语搜索这样的问题是非常有用的,不是用MQL,而是用C++。例如,像这样
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
会有很多纯编程论坛的链接,而C++与MQL相当相似

我把评论翻译成了俄语,并为MQL兼容性做了一些调整。我把脚本附在下面,编译它,一切都会变得清晰。

struct X
{
    void foo() const 
    {
        _x = 42; // ERROR! метод объявлен, как const, не можем менять члены 
        _y = 42; // ERROR! 
    }

    void bar(X& obj) const 
    {
        obj._x = 42; // OK! obj передается по ссылке и не имеет модификатора const
        _x = 42; // ERROR!
    }

    void bar(X const& obj) 
    {
        obj._x = 42; // ERROR! obj передается по ссылке, как const
        obj._y = 42; // ERROR! obj передается по ссылке, как const
        _x = 42; // OK! метод объявлен без const на сонце
    }

    int _x, _y;
};
附加的文件:
TestConst.mq4  2 kb
 
Alexey Volchanskiy:

私下里问了一个问题,这意味着什么。在论坛上匆忙回答,因为我发现了一个有用的例子,使人明白了。
顺便说一下,如果你会说英语,用英语搜索这种问题是非常有用的,不是用MQL,而是用C++。例如,像这样
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
会有很多纯编程论坛的链接,而C++与MQL相当相似

我把评论翻译成了俄语,并为MQL兼容性做了一些调整。我把脚本附在下面。 只要编译它,一切都会变得清晰。

文件没有带来任何明确的信息吗?

带有const修饰符的方法被称为常量,不能修改其类中的隐含成员常数类函数和常数参数的声明被称为常数正确性控制有了这个控制,你可以确信编译器将跟踪对象的未变值,并在侵权情况下在编译阶段产生错误。

const修饰符应该放在类声明中的参数列表之后在类之外的定义也应该包括const修饰语

使用完整性控制的另一个论据是,编译器会进行特殊的优化,例如将一个持久性对象放在只读存储器中

静态函数不能用const修饰符来定义,因为这个修饰符保证在调用这种函数时实例的成员保持不变但是,如上所述,静态函数根据定义不能访问非静态类成员。

https://www.mql5.com/ru/docs/basis/oop/staticmembers

此外,在我看来,你提出的不是最成功的构成结构的例子(先是方法,然后是成员数据)。而且,就这一点而言,最好是将其全部包裹在一个类中,而不是结构中,因为结构通常被用作数据的联合体(没有方法)。

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Статические члены класса - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Kozitsyn:

文件中没有说明问题吗?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

而且在我看来,你没有提供最好的例子来拼凑一个结构(先是方法,然后是成员数据)。而且,就这一点而言,最好是将其全部包裹在一个类中,而不是结构中,因为结构通常被用作数据的联合体(没有方法)。

包含

我记得在某个文件中写过,但我找不到了。我从stackoverflow复制了一个例子。把数据放在哪里是程序员的个人问题,尽管我自己把它放在开头。是否使用结构或类是程序员的个人问题 )))

 
Alexey Volchanskiy:

进入

我记得在文件中的某个地方写着,但我找不到。我从 stackoverflow 上偷了一个快速的例子。由程序员决定把数据放在哪里,尽管我自己把它放在开头。是使用结构还是使用类,由程序员决定 ))))

你可以用这样的方式对很多事情说 "私事"。但你是那个向别人解释的人,而且不是当面解释,而是公开解释。而你的 "私事 "与良好的编程风格相矛盾。而你要解释的人,以及许多其他用户可以把它当作一种好的风格,其实不然。

而关于想要(或可能领导)这里的课程的人,这样的 "bloop, bloop, bloop "说明了很多问题。

 
Метод с модификатором const称为常量,不能修改其类中的隐含 成员。
哪些成员是显性的,哪些是隐性的?
 
Dmitry Fedoseev:
哪些成员是显性的,哪些是隐性的?

显然,在这种情况下,这些是调用该方法的成员。或者,否则,它们是可以通过这个从方法中访问的成员。

 

在C++中,这意味着一个方法不能改变类的成员,除了声明为可变的成员。

在MQL中,这意味着一个方法原则上不能改变一个对象。

 
Комбинатор:

在C++中,这意味着一个方法不能改变类的成员,除了声明为可变的成员。

因为在MQL中你很难期待这一点,这意味着一个方法原则上不能改变一个对象。

一个常量方法不能只改变调用它的对象。但是如果另一个对象被传递给没有const修饰的方法,它(方法)可以很成功地改变它。
 
Alexey Kozitsyn:
一个常量方法不能只改变调用它 的对象。
这是一个疏忽吗?
 
Alexey Volchanskiy:
这是一个打字错误吗?
解释一下你的意思是什么?
 
恒定的方法 是另一个谚语 "我们想做得更好,但结果却和我们一贯的做法一样 "的例子。我认为这根本就是C++的箴言。没有实际用途,但它使OOP-程序的设计明显复杂化,因为你经常需要控制修改对象的类型(也必须是常数)。