Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Защита const - C++

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

C++
1
 const Int& operator= (const Int& a)
Отчего защищает первый const
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2012, 09:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Защита const (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 нет.

Ошибка: 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...

12
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 3
11.09.2012, 09:52 #2
Защищает от штук, подобных этой:
C++
1
2
Int a,b,c;
(a = b) = c;
Пример из Мэйерса. Присваивается значение b значению a, а затем результату этого присвоения присваивается c, что вроде как возможно для встроенных типов. Однако возврат константной ссылки из оператора operator= такое запретит. Мейерс говорит, что это не нужно. Я как-то не сталкивался.
1
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 10:24 #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, отсюда - костантность в первом примере это вредный излишек.
1
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
11.09.2012, 10:42 #4
в ифах крайне хорошо делать так:
C++
1
2
3
int a;
if(1 == a) {
}
ну то есть то что слева чтобы было константой, тогда на запись вида:
C++
1
2
3
int a;
if (1 = a) {
}
компилятор сам сругается.
понятно, что не всегда хотя бы один объект константа, но перед тем как написать иф, можно подумать.
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 10:54 #5
Хехе, на жаргоне это называют Условие Йоды
0
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
11.09.2012, 11:21  [ТС] #6
разобрался спасибо
0
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 3
11.09.2012, 15:28 #7
Цитата Сообщение от PSIAlt Посмотреть сообщение
Нене, у Мейерса был пример немного другой:
C++
1
if( a*b = c )
Ну Мейерс разный бывает я взял из второго издания "Эффективного использования С++" (1998 г), правило 15, стр.69.
И там как раз говорится, что конст возвращать из оператора присваивания не стоит - нарушает принципы присваивания, характерные для базовых типов.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 16:16 #8
Да вообще перегрузка операторов это зло :-)
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 16:32 #9
Ну, добро и зло - понятия для детей. Топор тоже для кого-то орудие убийства, а для кого-то это тепло зимой. Важно что есть топор и его можно использовать когда будешь строить баню или когда придут вражеские захватчики=) Суть одна - все хорошо в меру и в контексте конкретной ситуации
0
OhMyGodSoLong
11.09.2012, 18:17
  #10

Не по теме:

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

0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.09.2012, 19:46 #11
~OhMyGodSoLong~, Это наибольшее зло, которое ввел коммитет.. Хорошо хоть теперь есть explicit для операторов приведения типа.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 19:54 #12
А у кого-нибудь есть книженция нового стандарта поновее, чем черновик 3242? Неплохо бы иметь под рукой, для консультации при нахождении непонятного поведения.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.09.2012, 20:41 #13
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3376.pdf
1
11.09.2012, 20:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 20:41
Привет! Вот еще темы с ответами:

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

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...

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+'? ...

Чем отличаются выражения (const int[]){value} от (const int[]){100} - C++
(const int){22} //Приведение к массиву и инициализация его значениями 22 от (const int){i} //Приведение к массиву и инициализация его...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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