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

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

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

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

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

Допустим я перегружаю оператор присваивания для создаваемого класса 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 (C++):

Внутренняя компоновка с модификатором const - C++
Привет. Читаю Страуструпа "Язык программирования С++". Глава 9: Я не понимаю как используются эти 2 файла (file1.c & file2.c) в...

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

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

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

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

Модификатор const для параметра функции не const? - C++
void foo(const int N) { int Arr; //<-- ??? } В clang это работает. В VisualStudio 2015 нет.

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

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

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' - C++
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,"acc.dll",RT_RCDATA); if(!hRes){ } HGLOBAL...

const& и const* в имени функции - C++
Объясните пожалуйста что значит const& и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template <typename T> ...

error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+' - C++
Что означает ошибка в 8 строчке error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.04.2012, 15:59
Ответ Создать тему
Опции темы

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