Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
thick_int
Заблокирован
#1

Непонятки с модификатором const - C++

22.04.2012, 12:17. Просмотров 931. Ответов 9
Метки нет (Все метки)

Допустим я перегружаю оператор присваивания для создаваемого класса Array.
В учебнике предлагается вот такая сигнатура данной перегрзки:
C++
1
SArray const & SArray::operator=(SArray const & right)
Как ни удивительно, но все работает.
Модификатор const (для возвращаемого значения) указывается по мнению автора для того, чтобы отлавливать вот такие ситации (a1=a2)=a3. Хорошо допустим. Но как тогда вообще возможно присваивание, если объект является const. По идее он вообще не может в левой части оператора присваивания появится. Какая то чертовщина.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.04.2012, 12:24     Непонятки с модификатором const #2
thick_int, полагаю, вы путаете возвращаемое значение и передаваемое.
thick_int
Заблокирован
22.04.2012, 12:39  [ТС]     Непонятки с модификатором const #3
Да где путаница то?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
22.04.2012, 12:47     Непонятки с модификатором const #4
Что Вам помешает написать
C++
1
( a1 = b1 ) = c1;
если вы сделаете возвращаемую ссылку на объект не константной?
C++
1
SArray & SArray::operator=(SArray const & right)
Bers
Заблокирован
22.04.2012, 12:49     Непонятки с модификатором const #5
Цитата Сообщение от thick_int Посмотреть сообщение
Но как тогда вообще возможно присваивание, если объект является const.
объект не является const
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
22.04.2012, 13:54     Непонятки с модификатором const #6
Делай раз: оператор = получает неконстантный this и константную ссылку на объект, чьё значение присваиваем.
Делай два: оператор присваивает значение.
Делай три: оператор возвращает значение *this, которое имеет тип SArray& и неявно преобразуется к типу, указанному как возвращаемый: const SArray&
Факультативно: как сделать, чтобы оператор получал константный this? Объявить его как константную функцию:
bool operator == (const SArray& rhs) const;
thick_int
Заблокирован
22.04.2012, 13:56  [ТС]     Непонятки с модификатором const #7
Ну а теперь все это по-человечески.
По-моему я врубился. Суть в том, что результат оператора (в том числе и присваивания) вовсе не обязан совпадать как по типу, так и по констанстности с одним из своих операндов.
То есть, тип операнда - это одно, а тип оператора - это уже другое.
Корни этой непонятки растут из постоянно внушаемого многими авторами начальныых курсов, что мол значением и типом оператора присваивания является значение и тип его правого операнда.
На самом деле это верно только для фундаментальных типов.

Во всяком случае, у меня сложилось вот такое понимание этого вопроса. Подкорректируйте, если где-то есть неправильность.
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
22.04.2012, 13:59     Непонятки с модификатором const #8
Для фундаментальных типов это неверно. Например, правый операнд в операторе = у них константный, а результат - нет.
C++
1
2
int a, b = 0;
(a = b) = 0; // Компилируется
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
22.04.2012, 15:42     Непонятки с модификатором const #9
Цитата Сообщение от thick_int Посмотреть сообщение
тип оператора
У оператора нет типа. Оператор возвращает объект определенного типа. Оператор же есть на самом деле функция, которая вызывается к объекту.
При
C++
1
a1 = b1;
компилятором будет сгенерирована функция
C++
1
a1.operator=( b1 );
А как известно, функция может возвращать любые объекты любого типа, или не возвращать ничего вообще.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2012, 15:59     Непонятки с модификатором const
Еще ссылки по теме:

C++ Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
Внутренняя компоновка с модификатором const C++
C++ Чем отличаются выражения (const int[]){value} от (const int[]){100}
Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' C++
C++ Модификатор const для параметра функции не const?

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

Или воспользуйтесь поиском по форуму:
thick_int
Заблокирован
22.04.2012, 15:59  [ТС]     Непонятки с модификатором const #10
Цитата Сообщение от Toshkarik Посмотреть сообщение
А как известно, функция может возвращать любые объекты любого типа, или не возвращать ничего вообще.
Да я это вообщем то и хотел сказать, то есть именно этим и отличаются перегржаемые операторы для классов и структур от аналогичных операторов для фундаментальных типов.
Yandex
Объявления
22.04.2012, 15:59     Непонятки с модификатором const
Ответ Создать тему
Опции темы

Текущее время: 04:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru