2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Как оно работает?
Сообщение15.05.2010, 21:42 
Вот читал книжку "Дж. Коплиен - Программирование на C++" и наткнулся на один очень интересный кусочек кода:
Код:
class X;
....
int X::foo()const
{
   //////////нарушение константности
   typedef X *X_ptr_t;
   const X_ptr_t &This = (X_ptr_t)this;
   This->stat = 111;

   return 0;
}


В книжке написано что это наложение на себя чуть меньших ограничений(чем преобразование к неконстантному виду), но я почему-то не нигде больше не встречал чтобы было такое состояние "полу константности".
Может кто может объяснить как оно работает? (меня очень смущает слово "const")

 
 
 
 Re: Как оно работает?
Сообщение15.05.2010, 23:58 
Nerazumovskiy в сообщении #319765 писал(а):
(меня очень смущает слово "const")
const здесь относится к переменной This, тип которой - константная ссылка на неконстантный указатель на X. Т.е. изменять объект X, на который она указывает, можно.
Честно говоря, я не понял, чего они хотят этим добиться. Того что саму переменную This, как и this, поменять нельзя (она всегда указывает на один и тот же объект), можно сделать и без ссылки:
Код:
   typedef X *X_ptr_t;
   const X_ptr_t This = (X_ptr_t)this;
и даже без typedef:
Код:
   X* const This = (X*)this;

 
 
 
 Re: Как оно работает?
Сообщение16.05.2010, 01:37 
2Nerazumovskiy
Пример очень странный, и уж тем более в реальных ситуациях ничего подобного писать нельзя (ибо некрасиво)...

Вообще, если нужно из const функции-метода получить доступ к переменной-полю класса, можно эту переменную снабдить ключевым словом mutable, например:
Используется синтаксис C++
    struct Class
    {
        Class(): Variable(0) {}

        void Method() const
        {
            Variable++; // Increments Variable, really!
        }

        private: mutable int Variable;
    };
 


Также можно использовать оператор const_cast для добавления/удаления спецификаторов const/volatile.

Но я ещё раз замечу, что эти средства бывают необходимы очень редко...

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group