Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> const-функция не может изменить объект? или все-таки... 
:(
    Опции темы
Annihilator
Дата 24.7.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата из Стандарта пункт 9.3.2
Цитата

const member function shall not modify the object and its non-static data members

Т.е . const-функция не может изменить объект. А если так...
Код

class myclass {
public:
    myclass(int b) {a=c=b;}
    mutable int a; // can be modified by const-function because of MUTABLE
    int c;           // cannot be modified by const-function
    int foo_1() const; // cannot modify calling object
    int foo_2(myclass&) const; //cannot modify calling object
};
int main()
{    
    myclass m = 1;
    myclass k = 2;
    m.foo_1();
    k.foo_2(k);
    return 0;
}
int myclass::foo_1() const
{
    return a=111; // modifies mutable. It`s OK
}
int myclass::foo_2(myclass& r) const
{
    return r.c=222; // Modifies NOT MUTABLE!!!
}

Да, с помощью *this мы бы не смогли такое проделать, и если бы написали вот так
Код

int myclass::foo_2(const myclass& r) const

тоже бы получили ошибку, но при передаче по неконстантной ссылке, компилятор проглатывает 
это и в итоге имеем измененный объект myclass k. В итоге получается, что обошли константность функции.
Что скажете на это, товарищи.

Это сообщение отредактировал(а) Annihilator - 24.7.2008, 21:35


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
yar
Дата 24.7.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

Репутация: нет
Всего: 8



"shall not modify the object" -- Вероятно имеется в виду невозможность изменения именно объекта this, а не какого-то другого экземпляра?...
--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
mes
Дата 24.7.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Annihilator @  24.7.2008,  21:33 Найти цитируемый пост)
В итоге получается, что обошли константность функции.

не обошли - в данном случае k и k разные обьекты 
квалификатор const относится к this 
т.е если мы развернем функцию то  получится 
Код

// функция
   int foo_2(myclass&) const; 
// внутренне представлена примерно так:
static int foo_2(const myclass *this,  myclass& ); // никаких противоречий с вашим примером







--------------------
PM MAIL WWW   Вверх
Annihilator
Дата 24.7.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(mes @  25.7.2008,  01:46 Найти цитируемый пост)
квалификатор const относится к this 

это бесспорно, но в итоге после возврата в main() имеем измененный 
Код

myclass::k
, именно тот, который мы инициализировали как 
Код

myclass k = 2;

и именно в нем k.c равна не 2, как в начале, а 222.


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
mes
Дата 24.7.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Annihilator @  24.7.2008,  21:57 Найти цитируемый пост)
и именно в нем k.c равна не 2, как в начале, а 222. 

так в этом ничего удивительного нет..
переменая не отмечена как const
объект не константный
ссылка не константная
a const у метода распространяется только на this


--------------------
PM MAIL WWW   Вверх
Annihilator
Дата 24.7.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(mes @  25.7.2008,  02:08 Найти цитируемый пост)
a const у метода распространяется только на this

может я стандарт плохо посмотрел, может ссылку кинешь?

Ага нашел!

Но тем не менее константность перехитрили  smile 

Это сообщение отредактировал(а) Annihilator - 24.7.2008, 22:30


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Ulysses4j
Дата 24.7.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Annihilator, вы не пробовали предложения целиком читать? Меня в школе учили, что они несут смысловое единство...
Цитата
In a const member function, the object for which the function is called is accessed through a const access path; therefore, a const member function shall not modify the object and its non-static data members.



--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Annihilator
Дата 24.7.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Ulysses4j, 
Цитата(Annihilator @  25.7.2008,  02:21 Найти цитируемый пост)
Ага нашел!




--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
mes
Дата 24.7.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Annihilator @  24.7.2008,  22:21 Найти цитируемый пост)
Но тем не менее константность перехитрили 

неа Вы нигде не нарушили константность, то что Вы продекларивали метод константным, не говорит что объект стал константным
ваш пример аналогичен следуюшему (без классов)
Код

void f (const int& a, int& b)
{
   ++b;
   cout << "const a = " << a <<endl;  //выводим значение переданой константы
}

...
int i=5;

f(i,i); //  получаем const a = 6 , обманули константность ??? 



--------------------
PM MAIL WWW   Вверх
Annihilator
Дата 24.7.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Ulysses4j, ты не то привел.
Вот это надо
Цитата

The type of this in a member function of a class X is X*.  If the member function is declared const, the type of this is const  X*, if the member function is declared volatile, the type of this is volatile  X*, and if the member function is declared const  volatile, the type of this is const  volatile  X*.


mes, согласен. Обманули себя smile




Это сообщение отредактировал(а) Annihilator - 24.7.2008, 22:52


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Ulysses4j
Дата 24.7.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Annihilator, я привел первую часть той фразы, которая была цитирована в первом посте. И считаю, что это то.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.