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

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

Войти
Регистрация
Восстановить пароль
 
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
#1

Защита const - C++

11.09.2012, 09:29. Просмотров 576. Ответов 12
Метки нет (Все метки)

C++
1
 const Int& operator= (const Int& a)
Отчего защищает первый const
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2012, 09:29     Защита const
Посмотрите здесь:

const function C++
'const char* ...' does not much 'const char*' ??? C++
C++ static const
C++ const volatile
C++ static и const
const C++
C++ const int
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
757 / 690 / 124
Регистрация: 27.07.2012
Сообщений: 1,975
Завершенные тесты: 3
11.09.2012, 09:52     Защита const #2
Защищает от штук, подобных этой:
C++
1
2
Int a,b,c;
(a = b) = c;
Пример из Мэйерса. Присваивается значение b значению a, а затем результату этого присвоения присваивается c, что вроде как возможно для встроенных типов. Однако возврат константной ссылки из оператора operator= такое запретит. Мейерс говорит, что это не нужно. Я как-то не сталкивался.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 10:24     Защита const #3
Нене, у Мейерса был пример немного другой:
C++
1
if( a*b = c )
Типа опечатка вместо == поставили = и все скомпилилось, но получили неопредленное поведение.
По сути, вопрос там обобщается до "создавайте классы с поведением, схожим со встроенными типами". Так что const в случае operator= это не более чем выдумка автора.

Насчет поста №2: полагаю, что пример не очень удачный, т.к. по идее такая конструкция должна была бы работать(по законам встроенных типов):
C++
1
2
Int a,b,c;
a=b=c;
Но она работать не будет так как результат b=c будет const, а переменная a - не const, отсюда - костантность в первом примере это вредный излишек.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
11.09.2012, 10:42     Защита const #4
в ифах крайне хорошо делать так:
C++
1
2
3
int a;
if(1 == a) {
}
ну то есть то что слева чтобы было константой, тогда на запись вида:
C++
1
2
3
int a;
if (1 = a) {
}
компилятор сам сругается.
понятно, что не всегда хотя бы один объект константа, но перед тем как написать иф, можно подумать.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 10:54     Защита const #5
Хехе, на жаргоне это называют Условие Йоды
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
11.09.2012, 11:21  [ТС]     Защита const #6
разобрался спасибо
John Prick
757 / 690 / 124
Регистрация: 27.07.2012
Сообщений: 1,975
Завершенные тесты: 3
11.09.2012, 15:28     Защита const #7
Цитата Сообщение от PSIAlt Посмотреть сообщение
Нене, у Мейерса был пример немного другой:
C++
1
if( a*b = c )
Ну Мейерс разный бывает я взял из второго издания "Эффективного использования С++" (1998 г), правило 15, стр.69.
И там как раз говорится, что конст возвращать из оператора присваивания не стоит - нарушает принципы присваивания, характерные для базовых типов.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 16:16     Защита const #8
Да вообще перегрузка операторов это зло :-)
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 16:32     Защита const #9
Ну, добро и зло - понятия для детей. Топор тоже для кого-то орудие убийства, а для кого-то это тепло зимой. Важно что есть топор и его можно использовать когда будешь строить баню или когда придут вражеские захватчики=) Суть одна - все хорошо в меру и в контексте конкретной ситуации
OhMyGodSoLong
11.09.2012, 18:17
  #10

Не по теме:

Цитата Сообщение от Герц Посмотреть сообщение
Да вообще перегрузка операторов это зло :-)
Неявное приведение типов — большее зло.

ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
11.09.2012, 19:46     Защита const #11
~OhMyGodSoLong~, Это наибольшее зло, которое ввел коммитет.. Хорошо хоть теперь есть explicit для операторов приведения типа.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 19:54     Защита const #12
А у кого-нибудь есть книженция нового стандарта поновее, чем черновик 3242? Неплохо бы иметь под рукой, для консультации при нахождении непонятного поведения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 20:41     Защита const
Еще ссылки по теме:

Нужен ли const? C++
C++ Const #define
Int* const или const int*? C++
C++ No init for const!
C++ Const параметр

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
11.09.2012, 20:41     Защита const #13
http://www.open-std.org/JTC1/SC22/WG...2012/n3376.pdf
Yandex
Объявления
11.09.2012, 20:41     Защита const
Ответ Создать тему
Опции темы

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