メソッド宣言の後の 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修飾子の付いたメソッドは constant と呼ばれ、そのクラスの暗黙のメンバを変更 することができません。定数クラス関数や定数パラメータを宣言する ことを、const-correctnesscontrolと いいます。この制御により、コンパイラはオブジェクトの変更されない値を追跡し、侵害があった場合にはコンパイル段階でエラーを発生させることを保証することができます。

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から簡単な例を盗んできました。どこにデータを入れるかはプログラマー次第ですが、私自身は最初に入れました。構造体を使うかクラスを使うかはプログラマ次第 ))))

そんな風に、いろいろなことを「私事」と言うことがあります。でも、誰かに説明するのは、しかも対面ではなく公の場で。そして、あなたの「私情」は、良いプログラミングスタイルと矛盾しています。そして、説明する相手も、他の多くのユーザーも、そうではない良いスタイルと受け取ることができます。

そして、ここのコースを希望した(あるいは指導した)人については、そんな「ぶーぶーぶーぶー」が多くを語っています。

 
Метод с модификатором const は定数と呼ばれ、そのクラスの暗黙の メンバを変更することはできません。
どのメンバーが明示的で、どのメンバーが暗黙的なのか?
 
Dmitry Fedoseev:
どのメンバーが明示的で、どのメンバーが暗黙的なのか?

どうやら、この文脈では、メソッドを呼び出すメンバーであるようです。あるいは、そうでなければ、メソッドからこれを介してアクセスできるメンバーである。

 

C++では、メソッドは、mutableと宣言されたメンバーを除いて、クラスのメンバーを 変更することができないことを意味します。

MQLではほとんど期待できないので、原則的にメソッドでオブジェクトを変更することはできないことになります。

 
Комбинатор:

C++では、メソッドは、mutableと宣言されたメンバーを除いて、クラスのメンバーを 変更することができないことを意味します。

MQLではほとんど期待できないので、原則的にメソッドでオブジェクトを変更することはできないことになります。

定数メソッドは、それを呼び出したオブジェクトだけを変更することはできません。しかし、const修飾子なしで別のオブジェクトがメソッドに渡されると、それ(メソッド)は非常にうまくそれを変更することができます。
 
Alexey Kozitsyn:
定数メソッドは、それを呼び出した オブジェクトだけを変更することはできません。
これは見落としかな?
 
Alexey Volchanskiy:
それは誤字ですか?
どういう意味か説明してください。
 
コンスタント・メソッドも また、「もっとうまくやりたかったが、いつもうまくいっている」という諺の一例です。これは、C++のモットーでもあると思うんです。実用的な用途はありませんが、変更されたオブジェクトの型を常に制御する必要があるため、OOPプログラムの設計が非常に複雑になります(同様に一定でなければなりません)。
理由: