Was der Modifikator const nach einer Methodendeklaration bedeutet - Seite 4

 
Dmitry Fedoseev:
Es ist nicht Ihr eigenes, sondern ein völlig fremdes mit demselben Typ.

Was gehört Ihnen nicht? Dass der Typ derselbe ist?

Wollen Sie damit sagen, dass eine konstante Methode nicht die Klasse eines anderen ändern kann?

Und wenn Sie antworten, seien Sie bitte genauer, ich habe nicht verstanden, was Sie sagen wollten.

 
Alexey Kozitsyn:

Was gehört Ihnen nicht? Dass der Typ derselbe ist?

Wollen Sie damit sagen, dass eine konstante Methode nicht die Klasse eines anderen ändern kann?

Und wenn Sie antworten, seien Sie bitte deutlicher, ich habe nicht verstanden, was Sie meinen.

Sie sind es, der unverständlich schreibt Kann eine andere Klasse eines beliebigen Typs und desselben Typs wie er selbst ändern.
 

Um es einfach auszudrücken. In einer konstanten Methode ist es unmöglich, die Werte von Variablen zu ändern, die in derselben Klasse deklariert sind, in der sich die konstante Methode befindet (oder die in der übergeordneten Klasse deklariert ist). Ist das so?

 
Dmitry Fedoseev:
Du bist derjenige, der nicht versteht, was du schreibst Kann jemand anderes Klasse jeder Art und die gleiche wie sich selbst zu ändern.

Vielleicht solltest du doch aufpassen, was du schreibst. Wie kann eine Methode eine Klasse verändern? Vielleicht ein Klassenobjekt?

Und die Frage war in der Erklärung enthalten:

Eine konstante Methode kann ihre Klassenmitglieder nicht ändern.

Alexey hat ein Beispiel dafür gegeben, dass es sich ändern kann, daher glaube ich nicht, dass die Aussage richtig ist. Ich wollte den Kommentar von Vasiliy hören.

 
Alexey Kozitsyn:

Vielleicht solltest du doch aufpassen, was du schreibst. Wie kann eine Methode eine Klasse verändern? Vielleicht ein Klassenobjekt?

Und die Frage war in der Erklärung enthalten:

Alexey hat ein Beispiel dafür gegeben, dass es sich ändern kann, daher denke ich, dass die Aussage falsch ist, ich wollte Vasilys Kommentar hören.

Wie wäre es, wenn Sie aufmerksamer lesen würden? -"die Werte der deklarierten Variablen ändern"

Wie können Sie über Alexeys Behauptung sprechen? Er hat es nicht nur behauptet, er hat es wirklich bestätigt, er hat ein Beispiel gegeben, man kann es in einen Editor eingeben und sehen, wann es kompiliert und wann nicht.

 
Dmitry Fedoseev:

Um es einfach auszudrücken. In einer konstanten Methode ist es unmöglich, die Werte von Variablen zu ändern, die in derselben Klasse deklariert sind, in der sich die konstante Methode befindet (oder die in der übergeordneten Klasse deklariert ist). Ist das so?

Nein. Sie wissen doch, dass jedes Objekt einer Klasse seinen eigenen Satz von Variablen hat, die in dieser Klasse deklariert sind, oder? Und eine konstante Methode kann nicht nur das Objekt (d.h. die Menge) ändern, von dem aus sie aufgerufen wurde.
 
Alexey Kozitsyn:

Vielleicht solltest du doch aufpassen, was du schreibst. Wie kann eine Methode eine Klasse verändern? Vielleicht ein Klassenobjekt?

..

Zum Beispiel so:

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

 
Alexey Kozitsyn:
Nein. Sie wissen doch, dass jedes Objekt einer Klasse seinen eigenen Satz von Variablen hat, die in dieser Klasse deklariert sind, oder? Und eine konstante Methode kann nicht nur das Objekt (d.h. die Menge) ändern, von dem aus sie aufgerufen wurde.
Was hat ein Anruf damit zu tun? Es kommt darauf an, wo sich die Methode und die Variablen befinden. Wenn sich die Methode und die Variablen in derselben Klasse befinden, können sie nicht geändert werden. Wenn die Klasse per Referenz als Parameter übergeben wird, können Sie das tun.
 
struct X
{

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

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

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

   
};
Das macht mehr Sinn.
 
Dmitry Fedoseev:
Was hat der Anruf damit zu tun? Entscheidend ist, wo sich die Methode und die Variablen befinden. Wenn sich die Methode und die Variablen in derselben Klasse befinden, können Sie sie nicht ändern. Wenn die Klasse per Referenz als Parameter übergeben wird, können Sie das tun.
Die Herausforderung besteht darin, dass, wenn Objekt1 der Klasse A eine konstante Methode der Klasse A aufruft, diese Methode dieses Objekt1 (d. h. das Objekt1, das sie aufgerufen hat) nicht verändern kann. 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.