Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
#1

Изменить const с помощью mutable - C++

01.02.2012, 13:23. Просмотров 3126. Ответов 18
Метки нет (Все метки)

Привет всем, у меня 1 вот такой вопрос, почему в етом коде "а" - не изменяется? у меня же "b" -mutable?

помогите пожалуйста...

C++
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
private:
 const int a;
 mutable int b;
   public:
    void test()
     {
      b = 10;
         a = b;
     }
};
Спасибо заранее...

П.С мне надо в консолском приложение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2012, 13:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Изменить const с помощью mutable (C++):

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

Ребята напомните как изменить объект если он const ) - C++
Добрый день, как изменить объект если он создан с фишкой const помнил, но не использовал эти знания и они потерялись в памяти)

const_cast mutable - C++
в чем разница? спасибо.

Const_cast и mutable - C++
В чем их отличие и когда их необходимо использовать (если не нарушена архитектура программы)?

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&) const; ...

18
__bool
285 / 226 / 6
Регистрация: 13.06.2010
Сообщений: 744
01.02.2012, 13:29 #2
Цитата Сообщение от Programmer. Посмотреть сообщение
у меня же "b" -mutable
Я так понимаю если b - mutable,
то const игнорируется по отношению именно к b
mutable означает, что спецификатор const, примененный к классу, следует игнорировать. По стандарту только данные класса могут быть mutable.
Добавлено через 3 минуты
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Exm
{
    mutable int a; // добавили в объявление ключевое слово mutable
    // позволяющие игнорировать модификатор const
    // по отношению к данной переменной
    int b;
public:
    int getA() const //
    {
        return a; // все правильно
    }
    int setA(int i) const
    {
        a = i;// теперь всё правильно. Мы можем изменять переменную а
        b = i; // Ошибка! Переменная b  по прежнему не доступна для изменения.
    }
}
1
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
01.02.2012, 13:31  [ТС] #3
__bool,
С функциями всё понятно, мне с переменнами нужно
0
__bool
285 / 226 / 6
Регистрация: 13.06.2010
Сообщений: 744
01.02.2012, 13:34 #4
значит mutable вам не поможет.
mutable позволяет игнорировать модификатор const по отношению к данной переменной
1
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
01.02.2012, 13:45  [ТС] #5
__bool,
Спасибо.
Тогда вопрос прозвучит так: Как изменить значение у const в том классе?

0
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
03.02.2012, 01:12 #6
Цитата Сообщение от Programmer. Посмотреть сообщение
Как изменить значение у const в том классе?
Значение const переменной никак не нужно изменять, на то она и const.
1
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
03.02.2012, 15:00 #7
Цитата Сообщение от Programmer. Посмотреть сообщение
Тогда вопрос прозвучит так: Как изменить значение у const в том классе?
Очевидно ведь: объявить как не const.

Цитата Сообщение от Programmer. Посмотреть сообщение
mutable int b;
Вы сможете менять значение b, в этом объявлении
C++
1
const A obj;
0
gooseim
Эксперт С++
510 / 414 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
03.02.2012, 19:16 #8
Как вариант (только не вздумайте им пользоваться):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class A
{
private:
 const int a;
 int b;
   public:
      A(int v): a(v) {}
        void test(int v)
         {          
          *(const_cast<int*>(&a)) = v;
         }
      int getA() const {return a;}
};
 
int main()
{
   A a(10);
   a.test(100);
   std::cout << a.getA() << std::endl;
}
1
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
03.02.2012, 20:21 #9
gooseim, а разве это не undefined behaviour?
0
NoMasters
Псевдослучайный
1905 / 1116 / 77
Регистрация: 13.09.2011
Сообщений: 3,169
03.02.2012, 20:57 #10
go, нет, это просто грязный хак) А вот если бы константа была бы ещё и статической, то можно было бы напороться на защищенную от записи память.
1
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
04.02.2012, 19:11 #11
Цитата Сообщение от NoMasters Посмотреть сообщение
нет,
Почему пояснить можете?
1
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
04.02.2012, 19:27 #12
7.1.6.1 The cv-qualifiers
Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior.
оттуда же пример
C++
1
2
3
const int* ciq = new const int (3); // initialized as required
int* iq = const_cast<int*>(ciq); // cast required
*iq = 4; // undefined: modifies a const object
так что стандарт говорит, что go прав
1
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
04.02.2012, 19:33 #13
Цитата Сообщение от retmas Посмотреть сообщение
Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior.
Это говорит о том что я прав? Если мы убираем const с объекта, который на самом деле const, результатом будет undefined behaviour.
1
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
04.02.2012, 19:35 #14
нет, если мы модифицируем такой обьект, после снятия конста
т.е. из 8 поста
C++
1
*(const_cast<int*>(&a)) = v;
это не просто грязный хак. это undefined behaviour
1
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
04.02.2012, 19:39 #15
Цитата Сообщение от retmas Посмотреть сообщение
undefined behaviour
А я что утверждаю?..
1
04.02.2012, 19:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2012, 19:39
Привет! Вот еще темы с ответами:

Смысл спецификатора mutable - C++
В этом тема и заключается %-)

Поле mutable в структуре - C++
Добрый день. Есть структура struct NameStructure { protected: mutable TDateTime Time; ....... } Эту структуру я...

Внутренняя работа mutable - C++
Привет. Хочу спросить у особо продвинутых, как работает ключевое слово mutable. Вот тут, например: #include &lt;iostream&gt; #include...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения - C++
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start-&gt;next;} return c; } Функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru