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

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

Восстановить пароль Регистрация
 
thick_int
Заблокирован
22.04.2012, 12:17     Непонятки с модификатором const #1
Допустим я перегружаю оператор присваивания для создаваемого класса Array.
В учебнике предлагается вот такая сигнатура данной перегрзки:
C++
1
SArray const & SArray::operator=(SArray const & right)
Как ни удивительно, но все работает.
Модификатор const (для возвращаемого значения) указывается по мнению автора для того, чтобы отлавливать вот такие ситации (a1=a2)=a3. Хорошо допустим. Но как тогда вообще возможно присваивание, если объект является const. По идее он вообще не может в левой части оператора присваивания появится. Какая то чертовщина.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2012, 12:17     Непонятки с модификатором const
Посмотрите здесь:

Cannot convert 'const wchar_t *' to 'const char *' C++
C++ Что это bool operator== (const CLASS&) const;
C++ const& и const* в имени функции
int const и const int в чем разница этих записей C++
C++ error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 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
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
22.04.2012, 13:59     Непонятки с модификатором const #8
Для фундаментальных типов это неверно. Например, правый операнд в операторе = у них константный, а результат - нет.
C++
1
2
int a, b = 0;
(a = b) = 0; // Компилируется
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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}

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

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

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