2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Как оно работает?
Сообщение15.05.2010, 21:42 


23/12/08
245
Украина
Вот читал книжку "Дж. Коплиен - Программирование на 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 
Заслуженный участник


04/05/09
4593
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 
Заслуженный участник


26/07/09
1559
Алматы
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group