Изменение константы
От: MikaRSDN Soukhov Stock#
Дата: 12.05.02 12:37
Оценка:
Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает
Заранее благодарю
Re: Изменение константы
От: Anton V. Kolotaev  
Дата: 12.05.02 13:28
Оценка: 7 (2)
Здравствуйте MikaRSDN Soukhov, Вы писали:

MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает

MS> Заранее благодарю

Рассмотрим функцию, которая ищет заданное значение в массиве


template <class T>
   bool  test (const T *begin, const T *end, T x)
{
    while (begin != end)
        if (*begin++ == x)
            return true;
    return false;
}


На каждой итерации совершается два сравнения: на достижение конца массива и на совпадение элементов. От первого сравнения можно избавиться следующим образом.

    //   вспомогательный класс, который предназначен для
    //   локализации "cнятия const".
    template <class T>
        class SubstLock
    {
        const T         _value;
        const T * const _ptr; 
    public:
        SubstLock (const T * p, const T& v)
            :   _value (*p)
            ,   _ptr   (p)
        {
            *const_cast<T*>(_ptr) = v;
        }

        ~SubstLock() 
        {
            *const_cast<T*>(_ptr) = _value;
        }
   };

   template <class T>
       bool test (const T *begin, const T *end, T x)
   {
       if (begin != end)
       {
           {
               SubstLock <T>  __(end-1,x);
               while (*begin++ != x);
               if (begin != end-1) return true;
           }
           return end[-1] == x;
       }
       return false;
   }


С точки зрения вызывающей функции данные не изменяются, а на самом деле нам удобно подменить последний элемент массива, так что бы на нем всегда положительно проходила проверка на совпадение. Таким образом в проверке на достижение конца массива больше нет необходимости.
Если цикл выполняется довольно много раз, то можно получить выигрыш в скорости в несколько ассемблерных команд на один цикл.
Re: Изменение константы
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 13.05.02 10:31
Оценка: 2 (1)
Здравствуйте MikaRSDN Soukhov, Вы писали:

MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает

MS> Заранее благодарю

Где-то ошибка, и кто-то мажет по памяти или какая-нибудь функция меняет const-объект...

Этот код успешно меняет константу.
struct MyConst
{
  int i;
  MyConst():i(4){}
};

const MyConst my_const;

void main()
{
  (int&)my_const.i = 3;
  std::cout << my_const.i << std::endl;
}
Re[2]: Изменение константы
От: Аноним  
Дата: 13.05.02 10:34
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте MikaRSDN Soukhov, Вы писали:


MS>>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает

MS>> Заранее благодарю

DG>Где-то ошибка, и кто-то мажет по памяти или какая-нибудь функция меняет const-объект...


DG>Этот код успешно меняет константу.

DG>
DG>struct MyConst
DG>{
DG>  int i;
DG>  MyConst():i(4){}
DG>};

DG>const MyConst my_const;

DG>void main()
DG>{
DG>  (int&)my_const.i = 3;
DG>  std::cout << my_const.i << std::endl;
DG>}
DG>


Этот код не меняет константу. Результат работы этой программы не определен.
Re[3]: Изменение константы
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 13.05.02 10:43
Оценка:
Здравствуйте Аноним, Вы писали:

А>Этот код не меняет константу. Результат работы этой программы не определен.


В идеальном мире он ее может и не меняет, а вот в реальном — константа меняется,
и никто на это не ругается.
Re[4]: Изменение константы
От: Аноним  
Дата: 13.05.02 10:54
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Аноним, Вы писали:


А>>Этот код не меняет константу. Результат работы этой программы не определен.


DG>В идеальном мире он ее может и не меняет, а вот в реальном — константа меняется,

DG>и никто на это не ругается.

Это не имеет никакого значения. То, что константа в данном случае изменилась, просто один из вариантов неопределенного поведения. Кстати, писать void main() тоже ошибка.
Re[4]: Изменение константы
От: Sergey Россия  
Дата: 13.05.02 10:58
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Аноним, Вы писали:


А>>Этот код не меняет константу. Результат работы этой программы не определен.


DG>В идеальном мире он ее может и не меняет, а вот в реальном — константа меняется,

DG>и никто на это не ругается.

В реальном это зависит от компилятора и его опций Вполне можешь GPF огрести, если константа сидит в read-only памяти.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Изменение константы
От: Mishka Норвегия  
Дата: 13.05.02 12:25
Оценка: 4 (1)
Здравствуйте MikaRSDN Soukhov, Вы писали:

MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает

MS> Заранее благодарю

Страуструп 10.2.7.2: Объявление mutable.
Например:
class X
{
public:
    int x;
    mutable int y;
};

int main()
{
    const X x;
    x.y = 100;       // Это пройдёт
    x.x = 200;       // А вот это нет.
    return 0;
}


Ну и ещё такой вариант возможен:
#include <iostream>

struct X
{
    int i;
};

void f(const X& value)
{
    const_cast<X*>(&value)->i = 100;
}

int main()
{
    X x;
    x.i = 0;
    f(x);
    std::cout << x.i << std::endl;    
    return 0;
}

Выведет 100, чего вообщем-то нельзя ожидать из определения функции f.
Re[2]: Изменение константы
От: MikaRSDN Soukhov Stock#
Дата: 13.05.02 16:24
Оценка:
Здравствуйте Mishka, Вы писали:

M>Выведет 100, чего вообщем-то нельзя ожидать из определения функции f.


Я как раз и имел ввиду такие ситуации Спасибо
Re[3]: Изменение константы
От: Mishka™ Норвегия  
Дата: 16.05.02 10:57
Оценка:
Здравствуйте MikaRSDN Soukhov,

нашёл ещё одну ситуацию:
class X
{
public:
    static int x;
    void f(int y) const
    {
        x = y;
    }
};

int X::x = 0;

void main()
{
    X x;
    x.f(10);
    std::cout << x.x;
}

Получим 10.
Это происходит потому, что модификация статических членов класса разрешена даже в константных функциях (Meyers Item 21).
Re: Изменение константы
От: Ilnar Россия  
Дата: 17.05.02 15:10
Оценка:
Здравствуйте MikaRSDN Soukhov, Вы писали:

MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает

MS> Заранее благодарю

1. из-за переполнения буфера, например после массива идет ваша константа, выход за границы массива испортит константу
2. можно взять адрес константы и по адресу что-то написать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.