O que significa o modificador constante após uma declaração de método - página 4

 
Dmitry Fedoseev:
Não é seu próprio, mas um totalmente estrangeiro com o mesmo tipo.

O que não é seu? Que o tipo é o mesmo?

Você está dizendo que um método constante não pode mudar a classe de outra pessoa?

E quando você está respondendo, por favor seja mais específico, eu não entendi o que você está tentando dizer.

 
Alexey Kozitsyn:

O que não é seu? Que o tipo é o mesmo?

Você está dizendo que um método constante não pode mudar a classe de outra pessoa?

E ao responder, por favor, seja mais explícito, eu não entendi o que você quer dizer.

É você que está escrevendo incompreensivelmente Pode mudar a classe de outra pessoa de qualquer tipo e do mesmo tipo que ela mesma.
 

Para dizer de forma simples. Em um método constante, é impossível alterar os valores das variáveis declaradas na mesma classe em que o método constante está localizado (ou declarado em seu pai). É assim?

 
Dmitry Fedoseev:
Você é aquele que não entende o que está escrevendo Pode mudar a classe de outra pessoa de qualquer tipo e do mesmo tipo que ela mesma.

Talvez você devesse ter cuidado com o que está escrevendo afinal de contas. Como um método pode mudar uma classe? Talvez um objeto de classe?

E a questão estava na declaração:

Um método constante não pode mudar seus membros de classe.

Alexey deu um exemplo de que isso pode mudar, então eu não acho que a afirmação esteja correta, eu queria ouvir o comentário de Vasiliy.

 
Alexey Kozitsyn:

Talvez você devesse ter cuidado com o que está escrevendo afinal de contas. Como um método pode mudar uma classe? Talvez um objeto de classe?

E a questão estava na declaração:

Alexey deu um exemplo de que pode mudar, então eu acho que a afirmação está errada, eu queria ouvir o comentário de Vasily.

Que tal você ler mais atenciosamente? -"alterar os valores das variáveis declaradas"

Como você pode falar sobre a afirmação de Alexey? Ele não apenas o afirmou, ele o confirmou de verdade, deu um exemplo, você pode jogá-lo em um editor e ver quando ele compila e quando não o faz.

 
Dmitry Fedoseev:

Para dizer de forma simples. Em um método constante, é impossível alterar os valores das variáveis declaradas na mesma classe em que o método constante está localizado (ou declarado em seu pai). É assim?

Não. Você sabe que cada objeto de uma classe tem seu próprio conjunto de variáveis declaradas nesta classe, certo? E um método constante não pode mudar apenas o objeto (ou seja, o conjunto) a partir do qual foi chamado.
 
Alexey Kozitsyn:

Talvez você devesse ter cuidado com o que está escrevendo afinal de contas. Como um método pode mudar uma classe? Talvez um objeto de classe?

..

Assim:

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

 
Alexey Kozitsyn:
Não. Você sabe que cada objeto de uma classe tem seu próprio conjunto de variáveis declaradas nessa classe, certo? E um método constante não pode mudar apenas o objeto (ou seja, conjunto) do qual ele foi chamado.
O que a chamada tem a ver com isso? O que importa é a localização do método e das variáveis. Se o método e as variáveis estão localizados na mesma classe, não podem ser alterados. Se a classe for passada por referência como parâmetro, você pode.
 
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 на сонце
    }

   
};
Isso faz mais sentido.
 
Dmitry Fedoseev:
O que a chamada tem a ver com isso? O que importa é a localização do método e das variáveis. Se o método e as variáveis estiverem localizados na mesma classe, não será possível mudar. Se a classe for passada por referência como parâmetro, você pode.
O desafio aqui é que se o objeto1 da classe A chama um método constante da classe A, então esse método não pode mudar esse objeto1 (ou seja, o objeto1 que o chamou). Se, entretanto, o objeto1 for passado por referência ao mesmo método constante, mas chamado do objeto2 da classe A, então o objeto1 pode ser modificado. O objeto2, por sua vez, não pode.