Was der Modifikator const nach einer Methodendeklaration bedeutet - Seite 5

 
Alexey Kozitsyn:
Wenn Objekt1 der Klasse A eine konstante Methode der Klasse A aufruft, dann kann diese Methode dieses Objekt1 (d.h. das Objekt1, das sie aufgerufen hat) nicht verändern. Wird jedoch object1 per Referenz an dieselbe konstante Methode übergeben, die jedoch von object2 der Klasse A aufgerufen wird, kann object1 geändert werden. Objekt2 wiederum kann das nicht.

Wie kann ein Objekt eine Methode aufrufen? Eine Methode kann von einer Funktion oder von einer anderen Methode aus aufgerufen werden.

Es ist nicht nur eine Klassenmethode, die aufgerufen wird, sondern eine Methode eines bestimmten Objekts. Die Klasse selbst ist eine Abstraktion.

 
Dmitry Fedoseev:

Wie kann ein Objekt eine Methode aufrufen? Eine Methode kann von einer Funktion oder von einer anderen Methode aus aufgerufen werden.

Es ist nicht nur eine Klassenmethode, die aufgerufen wird, sondern eine Methode eines bestimmten Objekts. Die Klasse selbst ist eine Abstraktion.

Das ist es, was so trivial ist. Und ein Datensatz des Typs

obj.method();

Wie heißt es?

Sie schreiben es selbst:

Es ist nicht nur eine Klassenmethode, die aufgerufen wird, sondern eine Methode eines bestimmten Objekts.

Man kann auch sagen, dass es akzeptabel ist:

method();

Was bedeutet die Methode?

Das heißt, welche Methode wird aufgerufen von?

 
@Alexey Kozitsyn:

Das ist eine schwierige Frage. Und ein Eintrag wie...

Wie nennen Sie das?

Sie schreiben es selbst:

Sie sagen mir, dass es erlaubt ist:

Was bedeutet die Methode?

Das heißt, was ruft die Methode auf?

Sehen Sie sich die Situation an. Sie haben Probleme, nicht ich. Alexeys Beispiel erscheint Ihnen falsch, während es für mich ganz klar und verständlich ist.

--

Ein "type entry" wird als Aufruf der "method"-Methode des "obj"-Objekts bezeichnet.

--

"Sie werden mir auch sagen, dass eine solche Aufzeichnung zulässig ist" - man hat den Eindruck, dass Sie derjenige sind, der über so etwas schreibt.

---

Die Methode ruft nichts auf. Die Methode wird aufgerufen.

 
Dmitry Fedoseev:

Sehen Sie sich die Situation an. Sie sind es, nicht ich, der verwirrt ist. Das Beispiel von Alexej erscheint Ihnen falsch, während es mir klar und verständlich genug erscheint, es hat mir keine Fragen aufgeworfen, sondern mir nur ein Verständnis vermittelt.

--

Ein "type entry" wird als Aufruf der "method"-Methode des "obj"-Objekts bezeichnet.

--

"Sie werden mir auch sagen, dass eine solche Aufzeichnung zulässig ist" - man hat den Eindruck, dass Sie derjenige sind, der über so etwas schreibt.

---

Die Methode ruft nichts auf. Die Methode wird aufgerufen.

Alexejs Beispiel ist akzeptabel, aber es sollte meiner persönlichen Meinung nach nicht als Beispiel für andere dienen.

Sehen Sie, Sie haben meine Frage immer noch nicht beantwortet: Was löst einen Methodenaufruf einer Klasse aus (oder anders gesagt, was ruft eine Methode auf (nicht was durch eine Methode aufgerufen wird, sondern was/wer die Methode selbst aufruft))?

Jede Methode. Es ist eine einfache Frage, Sie haben einen Artikel für Anfänger über OOP geschrieben.

Eine Methode ruft nichts auf. Die Methode wird aufgerufen.

Womit wird es bezeichnet?
 
Alexey Kozitsyn:

1. Alexejs Beispiel ist akzeptabel, aber er sollte meiner persönlichen Meinung nach nicht als Vorbild für andere dienen.

2. Sehen Sie, Sie haben meine Frage immer noch nicht beantwortet: Was initialisiert einen Klassenmethodenaufruf (oder anders gesagt, was ruft eine Methode auf (nicht was über eine Methode aufgerufen wird, sondern was/wer die Methode selbst aufruft))?

3. jede Methode. Es ist eine einfache Frage, Sie haben einen Artikel für Anfänger über OOP geschrieben.

1. Schlagen Sie Ihr eigenes Beispiel vor.

2. Keine Antwort. Weil ich nicht weiß, wovon wir reden.

3. ich weiß auch nicht, wovon wir reden.

 
void fun(){
   obj.method();
}
Die "method"-Methode des "obj"-Objekts wird von der "fun"-Funktion aufgerufen.
 
Dmitry Fedoseev:

1. Geben Sie Ihr eigenes Beispiel.

2. Keine Antwort. Weil ich nicht weiß, wovon wir reden.

3. ich weiß auch nicht, wovon wir reden.

2. Die Diskussion dreht sich um den Aufruf der Klassenmethode (nicht der statischen Methode). Die Methode der Klasse wird durch das Objekt der Klasse aufgerufen, oder anders gesagt, das Objekt der Klasse initiiert den Aufruf der Methode der Klasse, z.B. this:

obj.method();   // obj - объект класса А, method() - метод класса А

Wenn die Methode konstant ist, kann sie das Objekt, über das sie aufgerufen wurde, d. h. das Objekt obj, nicht verändern. Ein Objekt (z.B. obj2), das ihm übergeben wird, ist dagegen nicht geeignet:

obj.method( obj2 );

kann geändert werden, wenn es ohne einen const-Modifikator per Referenz übergeben wird. Das ist alles.

Ich habe die Aussagen von Forum "corefeys" zunächst nicht verstanden:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Was bedeutet der Modifikator const nach der Methodendeklaration?

Combinator, 2016.01.31 20:32

In C++ bedeutet dies, dass die Methode keine Klassenmitglieder ändern kann, mit Ausnahme der als veränderbar deklarierten Mitglieder.

Da in MQL so etwas nicht möglich ist, bedeutet dies, dass die Methode das Objekt im Prinzip nicht verändern kann.

Oder

Forum für Handel, automatisierte Handelssysteme und Strategietests

Was bedeutet der Modifikator const nach der Methodendeklaration?

Vasiliy Sokolov, 2016.02.01 11:55

Eine konstante Methode ist ein weiteres Beispiel für das Sprichwort "Wir haben versucht, es besser zu machen, aber es hat sich herausgestellt, dass es das Gleiche wie immer ist". Ich denke, das ist ein Motto für C++ überhaupt. Es gibt keinen praktischen Nutzen, aber es erschwert den Entwurf von OOP-Programmen erheblich, weil man ständig den Typ des geänderten Objekts kontrollieren muss (er muss auch konstant sein).

oder

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Was bedeutet der Modifikator const nach der Methodendeklaration?

Vasiliy Sokolov, 2016.02.01 14:02

Beispiel Alexey schrieb. Eine konstante Methode kann die Mitglieder ihrer Klasse nicht ändern...

Warum kann sie das nicht tun? Alles ändert sich perfekt. Und die Formulierung selbst ist falsch: eine konstante Methode kann die Mitglieder einer Instanz ihrer Klasse nicht ändern.

 
Vasiliy Sokolov:

Ich leugne es nicht. Sharpe ist in der Tat eine perfekte, große und schöne Sprache.

OK, sagen wir, Sie können immer mit einem Verstoß davonkommen. Aber erklären Sie lieber kurz anhand eines Beispiels, was es mit der Konst? Welchen Nutzen hat sie wirklich? Durch ein Beispiel und möglichst nicht aus der Luft gegriffen.

Es ist eine Sache, wenn man ein Projekt für sich selbst schreibt und das ganze Projekt in Tausenden - Zehntausenden von Zeichenfolgen. Es ist eine andere Sache, wenn man einem Kunden ein Projekt mit Millionen von Zeilen gibt und ein Hindu Harikrishna dasitzt und keine Ahnung hat. Ich habe mit Hindus aus Bangalore gearbeitet, und das Niveau war tatsächlich niedriger als das unserer Jungs.

Es ist wie dort: Sie machen eine Ausbildung zum Programmierer und nehmen den Rest ihrer Verwandten mit zur Arbeit, und die wissen vielleicht gar nichts. Sie sind Zigeuner.

Und wenn der kritische Code in eine Libu gepackt wird, ist die Gefahr einer Beschädigung geringer. Das denke ich auch.

 
Alexey Kozitsyn:

...

Warum geht das nicht? Alles kann problemlos geändert werden. Und die Formulierung selbst ist falsch: eine konstante Methode kann keine Mitglieder einer Instanz ihrer Klasse ändern.

Das ist es, was ich meine, denn wir sprechen in diesem Zusammenhang nicht von der Art. "Eigene Klasse" ist offensichtlich eine eigene Instanz (d. h. ein Objekt).

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

Das Element_x gehört zur selben Klasse wie die Methode bar.

C obj._x - hier ist das _x-Mitglied in einer fremden Klasse obj.

Ich halte es für akzeptabel, von einer Klasse und nicht von einer Instanz zu sprechen, denn es ist offensichtlich, dass _x zu unserer Klasse gehört, die wir schreiben, und obj.x zu der fremden Klasse, die wir behandeln.

Apropos OOP-Terminologie, die gesamte Terminologie hier ist ein bisschen davon (oder sogar sehr viel).

 

Ich persönlich habe const-Methoden immer als Methoden verstanden, die keine Klassenvariablen verändern können.

Ich habe sie sehr selten verwendet, weil ich oft auf eine Situation gestoßen bin, in der eine Neudefinition einer Methode eine Änderung erfordert, während die Basismethode konstant bleibt (dies wurde hier bereits erwähnt).

Statische Methoden werden in großem Umfang eingesetzt. In fast jeder komplexen Klasse. In der Regel handelt es sich um "dienende" zusätzliche Methoden, die keinen Zugriff auf die Klassenvariablen erfordern.

Außerdem versuche ich für Konstanten wie "Anzahl der Sekunden an einem Tag" eine statische Konstante zu verwenden, anstatt #define. In diesem Fall befinden sich Deklaration und Initialisierung einer solchen Konstante an verschiedenen Stellen, aber die Typkontrolle tritt auf und hilft mir mehr als einmal.