Ce que signifie le modificateur const après une déclaration de méthode - page 4

 
Dmitry Fedoseev:
Ce n'est pas le vôtre, mais un autre totalement étranger avec le même type.

Qu'est-ce qui n'est pas à toi ? Que le type est le même ?

Êtes-vous en train de dire qu'une méthode constante ne peut pas changer la classe d'un autre ?

Et quand vous répondez, soyez plus précis, je n'ai pas compris ce que vous essayez de dire.

 
Alexey Kozitsyn:

Qu'est-ce qui n'est pas à toi ? Que le type est le même ?

Êtes-vous en train de dire qu'une méthode constante ne peut pas changer la classe d'un autre ?

Et lorsque vous répondez, soyez plus explicite, je n'ai pas compris ce que vous vouliez dire.

C'est vous qui écrivez de façon incompréhensible Peut changer la classe de quelqu'un d'autre de n'importe quel type et du même type que lui.
 

Pour le dire simplement. Dans une méthode constante, il est impossible de modifier les valeurs des variables déclarées dans la même classe où se trouve la méthode constante (ou déclarées dans son parent). C'est vrai ?

 
Dmitry Fedoseev:
C'est vous qui ne comprenez pas ce que vous écrivez Peut changer la classe de quelqu'un d'autre de n'importe quel type et identique à lui-même.

Peut-être que tu devrais faire attention à ce que tu écris après tout. Comment une méthode peut-elle modifier une classe ? Peut-être un objet de classe?

Et la question était dans la déclaration :

Une méthode constante ne peut pas modifier les membres de sa classe.

Alexey a donné un exemple que cela peut changer, donc je ne pense pas que l'affirmation soit correcte, je voulais entendre le commentaire de Vasiliy.

 
Alexey Kozitsyn:

Peut-être que tu devrais faire attention à ce que tu écris après tout. Comment une méthode peut-elle modifier une classe ? Peut-être un objet de classe?

Et la question était dans la déclaration :

Alexey a donné un exemple que cela peut changer, donc je pense que l'affirmation est fausse, je voulais entendre le commentaire de Vasily.

Et si tu lisais de manière plus réfléchie ? -"changer les valeurs des variables déclarées"

Comment pouvez-vous parler de l'affirmation d'Alexey ? Il ne s'est pas contenté de l'affirmer, il l'a confirmé pour de bon, il a donné un exemple, vous pouvez le lancer dans un éditeur et voir quand il compile et quand il ne compile pas.

 
Dmitry Fedoseev:

Pour le dire simplement. Dans une méthode constante, il est impossible de modifier les valeurs des variables déclarées dans la même classe où se trouve la méthode constante (ou déclarées dans son parent). C'est vrai ?

Non. Vous savez que chaque objet d'une classe a son propre ensemble de variables déclarées dans cette classe, n'est-ce pas ? Et une méthode constante ne peut pas modifier uniquement l'objet (c'est-à-dire l'ensemble) à partir duquel elle a été appelée.
 
Alexey Kozitsyn:

Peut-être que tu devrais faire attention à ce que tu écris après tout. Comment une méthode peut-elle modifier une classe ? Peut-être un objet de classe?

..

Comme ça :

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

 
Alexey Kozitsyn:
Non. Vous savez que chaque objet d'une classe a son propre ensemble de variables déclarées dans cette classe, n'est-ce pas ? Et une méthode constante ne peut pas modifier uniquement l'objet (c'est-à-dire l'ensemble) à partir duquel elle a été appelée.
Qu'est-ce que le fait d'appeler a à voir avec ça ? C'est l'emplacement de la méthode et des variables qui importe. Si la méthode et les variables sont situées dans la même classe, elles ne peuvent pas être modifiées. Si la classe est passée par référence en tant que paramètre, vous pouvez le faire.
 
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 на сонце
    }

   
};
C'est plus logique.
 
Dmitry Fedoseev:
Qu'est-ce que l'appel a à voir avec ça ? Ce qui compte, c'est l'emplacement de la méthode et des variables. Si la méthode et les variables sont situées dans la même classe, vous ne pouvez pas les modifier. Si la classe est passée par référence en tant que paramètre, vous pouvez le faire.
Le problème ici est que si l'objet1 de la classe A appelle une méthode constante de la classe A, alors cette méthode ne peut pas changer cet objet1 (c'est-à-dire l'objet1 qui l'a appelé). Cependant, si l'objet 1 est passé par référence à la même méthode constante, mais appelée depuis l'objet 2 de la classe A, alors l'objet 1 peut être modifié. L'objet 2, quant à lui, ne peut pas.