Что означает модификатор const после объявления метода - страница 4

 
Dmitry Fedoseev:
Не своего, а совершенно постороннего, только тип такой же.

Что не своего? Что тип такой же?

Вы хотите сказать, что константный метод не сможет поменять чужого класса?

И когда отвечаете, пишите, пожалуйста, более развернуто, не понял, что Вы хотите сказать. 

 
Alexey Kozitsyn:

Что не своего? Что тип такой же?

Вы хотите сказать, что константный метод не сможет поменять чужого класса?

И когда отвечаете, пишите, пожалуйста, более развернуто, не понял, что Вы хотите сказать. 

Это вы непонятно что пишите Сможет поменять чужой класс любого типа и такого же как сам. 
 

Если по простому. В константном методе невозможно изменять значения переменных объявленных в том же классе где находится этот константный метод (или объявленных в его родителе). Так?

 
Dmitry Fedoseev:
Это вы непонятно что пишите Сможет поменять чужой класс любого типа и такого же как сам. 

Может Вы все-таки следить будите за тем, что пишите? Как это метод может класс поменять? Может объект класса?

И вопрос был в утверждении: 

Константный метод не может менять члены своего класса

Алексей привел пример, что может поменять, так что я считаю, что утверждение не верно, хотел услышать комментарий от Василия.

 
Alexey Kozitsyn:

Может Вы все-таки следить будите за тем, что пишите? Как это метод может класс поменять? Может объект класса?

И вопрос был в утверждении: 

Алексей привел пример, что может поменять, так что я считаю, что утверждение не верно, хотел услышать комментарий от Василия.

А может будете читать вдумчивее? -  "изменять значения переменных объявленных"

Как можно говорить про утверждение Алексея? Он не просто утверждает, а подтвердил реально, привел пример, можно закинуть в редактор и посмотреть когда компилируется, а когда нет. 

 
Dmitry Fedoseev:

Если по простому. В константном методе невозможно изменять значения переменных объявленных в том же классе где находится этот константный метод (или объявленных в его родителе). Так?

Нет. Вы же в курсе, что у каждого объекта класса свой набор переменных, объявленных в этом классе? И константный метод не может поменять только тот объект (то-есть набор), из которого он был вызван.
 
Alexey Kozitsyn:

Может Вы все-таки следить будите за тем, что пишите? Как это метод может класс поменять? Может объект класса?

..

Вот так:

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

    

 
Alexey Kozitsyn:
Нет. Вы же в курсе, что у каждого объекта класса свой набор переменных, объявленных в этом классе? И константный метод не может поменять только тот объект (то-есть набор), из которого он был вызван.
Причем тут вызов? Значение имеет расположение метода и переменных. Если метод и переменные расположены в одном классе, то невозможно поменять. Если класс передан по ссылке как параметр, то можно. 
 
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 на сонце
    }

   
};
Так будет понятней.
 
Dmitry Fedoseev:
Причем тут вызов? Значение имеет расположение метода и переменных. Если метод и переменные расположены в одном классе, то невозможно поменять. Если класс передан по ссылке как параметр, то можно. 
Вызов тут при том, что если объект1 класса А вызывает константный метод класса А, то этот метод не может менять этот объект1 (т.е. тот объект1, который его вызвал). Если же объект1 передать по ссылке в этот же самый константный метод, но вызванный из объекта2 класса А, то объект1 можно будет изменить. Объект2, в свою очередь, нет.
Причина обращения: