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

Const-параметры в аргументах функции - C++

Восстановить пароль Регистрация
 
 
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
13.07.2015, 19:19     Const-параметры в аргументах функции #1
Цитата Сообщение от hoggy Посмотреть сообщение
void setAmount(const int _amoutn)
А тут уже const излишен, перебор.

Добавлено через 3 минуты
C++
1
2
3
    void setDescription(const std::string& _description) { m_description = _description; }
    //...
    std::string& getDescription()                        { return m_description;  }
Зачем дублировать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
13.07.2015, 19:25     Const-параметры в аргументах функции #2
Цитата Сообщение от Avazart Посмотреть сообщение
А тут уже const излишен, перебор.
технически - да, излишний.

однако, квалификатор конст нужен не компилятору, а человеку.
граммар-конст подразумевает по максимому использовать константы.

пример:

C++
1
2
3
4
void foo(const int v)
{
    v = 10; //error: assignment of read-only parameter ‘v’
}
это гарантирует исполнение правила "один объект - одна задача".
подробности вы можете прочитать в книге Макконелла "Идеальный код".

Цитата Сообщение от Avazart Посмотреть сообщение
Зачем дублировать?

чего дублировать?

вы имеете ввиду, зачем мутабельный геттер, если есть сеттер?

в этом смысле замечание верное.
совершенно не зачем.
мутабельные геттеры можно удалить.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
13.07.2015, 19:35  [ТС]     Const-параметры в аргументах функции #3
Цитата Сообщение от hoggy Посмотреть сообщение
однако, квалификатор конст нужен не компилятору, а человеку.
граммар-конст подразумевает по максимому использовать константы.
Как раз человеку он навиг не нужен.

http://bookscafe.net/read/satter_ger...TOC_idp1114480

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
чего дублировать?
вы имеете ввиду, зачем мутабельный геттер, если есть сеттер?
в этом смысле замечание верное.
совершенно не зачем.
мутабельные геттеры можно удалить.
Вероятно что-то одно стоит использовать пару гетер/сеттер и или пару по ссылке/константной ссылке.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
13.07.2015, 20:02     Const-параметры в аргументах функции #4
Цитата Сообщение от Avazart Посмотреть сообщение
Как раз человеку он навиг не нужен.
1.
здрасти приехали.
вы ещё скажите, что модификаторы доступа public/protected/private
тоже нафиг человеку не нужны.

наверное, это какая то особая магия, без которой компилятор не в состоянии работать.

2.
при этом вы аппелируете к Саттеру,
который как раз таки призывает к граммар-конст.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
13.07.2015, 20:38  [ТС]     Const-параметры в аргументах функции #5
Цитата Сообщение от hoggy Посмотреть сообщение
при этом вы аппелируете к Саттеру,
который как раз таки призывает к граммар-конст.
От туда
Пример. Избегайте const в объявлениях функций, принимающих параметры по значению.
Мы рекомендуем объявлять функции без таких высокоуровневых модификаторов const, чтобы тот, кто читает ваши заголовочные файлы, не был дезориентирован.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
13.07.2015, 20:44     Const-параметры в аргументах функции #6
Цитата Сообщение от Avazart Посмотреть сообщение
Мы рекомендуем объявлять функции без таких высокоуровневых модификаторов const, чтобы тот, кто читает ваши заголовочные файлы, не был дезориентирован.
интересно, и чем это таким он может быть дезоринтирован?
передавать константу, а потом снимать конст при помощи const_cast - вот это - дезориентация.

оттуда же:

Однако использование такого модификатора имеет значение в определении функции и его применение может быть оправдано с точки зрения обнаружения непреднамеренного изменения переданного параметра:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
13.07.2015, 20:50  [ТС]     Const-параметры в аргументах функции #7
Цитата Сообщение от hoggy Посмотреть сообщение
оттуда же:
Однако использование такого модификатора имеет значение в определении функции и его применение может быть оправдано с точки зрения обнаружения непреднамеренного изменения переданного параметра:
Речь шла о
C++
1
void setPrice(const int _price) { m_price = _price; }
Где тут нужен запрет модификации?

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
интересно, и чем это таким он может быть дезоринтирован?
Излишеством, да и ф-ция не становится короче/лаконичнее от таких записей.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
14.07.2015, 12:33     Const-параметры в аргументах функции #8
Цитата Сообщение от Avazart Посмотреть сообщение
Где тут нужен запрет модификации?
нигде.

согласно граммар-конст, правило формулируется, как:
"все, что не должно быть изменено (не будет меняться), должно быть константами"

и это правило - универсально.
приняв за правило делать константами все,
что измениться не должно,
мы следуем эту стилю во всем.

Цитата Сообщение от Avazart Посмотреть сообщение
Излишеством, да и ф-ция не становится короче/лаконичнее от таких записей.
чушь.
кстати, конст не является излишеством.
например, в стародавние временя он помогал убогим компиляторам оптимизировать.

ваше "лаконично/короче" не имеет никакого отношения к дезориентации.
------------------------------------------------------------------------------------------------

на самом деле, вы далеко не первый, кто отсылал меня к Саттеру.
но ни вы, ни кто другой, так и не смогли ответить на этот вопрос.

а вот я могу.
хотите?

посмотрите внимательно, и скажите,
чем отличаются эти две функции?

C++
1
2
3
4
void foo(const int v)
{
    const auto d = v+1;
}
C++
1
2
3
4
void foo(int v)
{
    const auto d = v+1;
}
ответ:

в первом случае, программист вежливо попросил компилятор проконтролировать,
что внутри функции значение аргумента не должно быть изменено.

и это - единственное отличие.
а полном смысле этого слова.

у этих функций одна и та же сигнатура.

правило звучит так:
"в сигнатуре функции квалификатор конст не учитывается для параметров по значению".

таким образом имеем:

C++
1
2
3
4
void foo(const int v) { const auto d = v+1; }
 
// error: redefinition of ‘void foo(int)’
void foo(int v) { const auto d = v+1; }

либо:

http://rextester.com/YOJVM30406

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    std::cout <<"сигнатуры идентичны? (должно быть 1) " 
        << std::is_same< void(*)(int), void(*)(const int) >::value 
    <<std::endl;
}
соответственно, указателю на функцию можно присваивать адрес функции забивая болт на разницу в квалификаторах параметров.


однако сказать, что это как то может дезорентировать - по меньше мене глупо.

потому что:

1.
об этом нюансе языка вообще не каждый программист знает.
не каждый вообще когда нибудь с этим сталкивался воочию.
и об этом почему то не писал ваш любимый Саттер.
верно, вы ему наслово поверили?


2.
с таким же успехом можно сказать, что const в указателях дезорентирует
(новички часто путаются: справа/слева от звездочки).

на самом деле это - синтаксис языка.
не больше и не меньше.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
14.07.2015, 13:02  [ТС]     Const-параметры в аргументах функции #9
Я указал на конкретную ф-цию, так что не нужно съесжать и выдумывать/впадать в крайности и писать про const с указателями.
По моему логично что все лишние телодвижения дезаориентируют.

Не по теме:


И да синтаксис записи модификаторов указателей в С++ муторный и тут лишь это остается признать и смериться.



Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
что внутри функции значение аргумента не должно быть изменено.
Вообще лично для меня загадка, в каких случаях такое требуется, и задается вопрос что у человека такая короткая память, что он внутри ф-ция якобы забудет и случайно изменит переменную.

Добавлено через 13 минут
Цитата Сообщение от hoggy Посмотреть сообщение
и об этом почему то не писал ваш любимый Саттер.
Как не написал?
Два следующих объявления абсолютно эквивалентны:
void Fun(int x);

void Fun(const int x); // Объявление той же самой функции:
// const здесь игнорируется
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
14.07.2015, 19:49     Const-параметры в аргументах функции #10
Цитата Сообщение от Avazart Посмотреть сообщение
Я указал на конкретную ф-цию, так что не нужно съесжать и выдумывать/впадать в крайности и писать про const с указателями.
По моему логично что все лишние телодвижения дезаориентируют.
я никуда не съезжаю, и не выдумываю.
я раскрываю свою точку зрения: нет места дезоринтации.

я ещё понимаю, если б вы написали что нить вроде:

C++
1
2
//в хэдере
void foo(int);
в спп
C++
1
2
//в cpp файле
void foo(const int v) { ... }
прототипы смотрятся по разному.
хотя на самом деле это объявление и определение одной функции.
все компилится и прекрасно работает.
а выглядит по разному.

но вы же этого не написали.
единственный ваш довод: "так сказал Саттер".
а если бы Саттер сказал: "убейтесь все об стенку"?


Саттер нефига не пояснил свою точку зрения.
его утверждение голословно.

---------------------------------------------------------------

а телодвижения телодвижениям рознь.
писать вручную сеттеры и геттеры - это тоже телодвижения.
в конкретно взятом говнокоде ситуации могут рассматриваться,
как лишние телодвижения.

с граммар-конст - аналогично.

я специально подчеркиваю мысль: правило унифицированно.
"все, что не должно меняться - должно быть const".

согласно граммар-конст, должны быть основание посерьезнее собственной лени,
что бы отходить от этого правила.

точно так же, как должны быть веские причины,
что бы отказаться от сеттеров/геттеров.

Цитата Сообщение от Avazart Посмотреть сообщение
Вообще лично для меня загадка, в каких случаях такое требуется
гарантирует (путем исключения человеческого фактора) четкое разделение данных:
на внутреннее состояние автомата, и входные/выходные параметры.

что привентивно сокращает стоимость отладки и сопровождения.


Цитата Сообщение от Avazart Посмотреть сообщение
и задается вопрос что у человека такая короткая память, что он внутри ф-ция якобы забудет и случайно изменит переменную.
нет, он - крутой хацкер.
пишет идеальный код с первого же раза, и никогда не ошибается.

вы походу не вдупаляете,
зачем вообще был изобретен квалификатор const.

Цитата Сообщение от Avazart Посмотреть сообщение
Как не написал?
ух ты, и в правду написал.
но как то не раскрыл тему.

и ни вы, никто другой почему то так и не смогли внятно её раскрыть.
я о дезорентации.

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
И да синтаксис записи модификаторов указателей в С++ муторный и тут лишь это остается признать и смериться.
не путайте "квалификатор" и "модификатор".

модификаторы представлены вот здесь:
http://en.cppreference.com/w/cpp/language/types



Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
14.07.2015, 19:58  [ТС]     Const-параметры в аргументах функции #11
Цитата Сообщение от hoggy Посмотреть сообщение
но вы же этого не написали.
единственный ваш довод: "так сказал Саттер".
а если бы Саттер сказал: "убейтесь все об стенку"?
Вообще то что сказал Саттер довольно банально, но вероятно не для вас.

Цитата Сообщение от hoggy Посмотреть сообщение
гарантирует (путем исключения человеческого фактора) четкое разделение данных:
на внутреннее состояние автомата, и входные/выходные параметры.
что привентивно сокращает стоимость отладки и сопровождения.
Да лабуда это, это не человеческий фактор, а фактор-дебила который и так найдет чем "загнуть" эту ф-цию.
Как можно в пределах ф-ции можно забыть и "случайно" модифицировать ф-цию?
У вас что функции километрами?
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
14.07.2015, 21:14     Const-параметры в аргументах функции #12
Цитата Сообщение от Avazart Посмотреть сообщение
Вообще то что сказал Саттер довольно банально, но вероятно не для вас.
Справедливости ради, Скотт Мэйерс придерживается схожего с твоим оппонентом мнения (Effective С++, third edition).
Item 3: Use const whenever possible
There's nothing particularly new about const parameters — they act just like local const objects, and you should use both whenever you can. Unless you need to be able to modify a parameter or local object, be sure to declare it const. It costs you only the effort to type six characters, and it can save you from annoying errors such as the "I meant to type '==' but I accidently typed '='" mistake we just saw.
В общем и целом действительно есть такое направление, которое можно скорее отнести к code style, чем к чему-то еще. Вполне имеет право на существование. Я видел проекты целиком оформленные таким образом.

Я думаю, эта тема не стоит таких ожесточенных споров.
Так что, ребята, давайте закругляться, а то придется вырезать ваши разговоры и выпуливать их в священные войны.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
14.07.2015, 21:43  [ТС]     Const-параметры в аргументах функции #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Справедливости ради, Скотт Мэйерс придерживается схожего с твоим оппонентом мнения (Effective С++, third edition).
Справедливости ради стоило прочитать ссылку на Саттера для начала он говорит ровным счетом тоже самое, но только с поправками, но кому для понимания банальщины и этого мало. Ну до ладно...

Цитата Сообщение от DrOffset Посмотреть сообщение
Я видел проекты целиком оформленные таким образом.
Ок, что бы не быть многословным, если вы уже взяли книгу Мэйерса то может мне покажите хоть один пример кода в его книге (да и вообще из какой нибудь адекватной либы) где const бездумно пихался в параметры ф-ции передаваемые по значению?
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
14.07.2015, 22:06     Const-параметры в аргументах функции #14
Цитата Сообщение от Avazart Посмотреть сообщение
Ок, что бы не быть многословным, если вы уже взяли книгу Мэйерса то может мне покажите хоть один пример кода в его книге (да и вообще из какой нибудь адекватной либы) где const бездумно пихался в параметры ф-ции передаваемые по значению?
Я с тобой спорить не собираюсь. Я привел цитату, где Мэйерс в отличие от Саттера оговорок не делал. Он наоборот написал "должны"
and you should use both whenever you can
Т.е. он считает, что лучше использовать, чем не использовать, везде, где это возможно.

Я не говорю, что я согласен с ним, но и не говорю, что не согласен. Я привел источник, выводы делай из него сам. А подобные споры меня интересуют мало.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
14.07.2015, 22:09  [ТС]     Const-параметры в аргументах функции #15
Слив принят.
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
14.07.2015, 22:18     Const-параметры в аргументах функции #16
Цитата Сообщение от Avazart Посмотреть сообщение
Слив принят.
Детский сад какой-то, ей-богу. Общаться нормально вообще разучились?

Кстати, раз уж хочется послушать доводы за и против, то на все нужные ссылки можно найти начав отсюда. Прямую ссылку я дать не могу, из-за правил форума. Было очень объемное обсуждение на comp.lang.c++.moderated.

Прежде чем мне писать ответ, подумай о том, что помимо "за" и "против" может быть нейтральное мнение. У меня как раз такое. Сам я так не пишу, но другим бы запрещать не стал.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
14.07.2015, 22:23  [ТС]     Const-параметры в аргументах функции #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Общаться нормально вообще разучились?
Ну так не засовывал свои пять копеек справедливости...
А потом мол Понтий Пилат умывает руки, и чет про нейтральное мнение ...
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
14.07.2015, 22:33     Const-параметры в аргументах функции #18
Цитата Сообщение от Avazart Посмотреть сообщение
Вообще то что сказал Саттер довольно банально, но вероятно не для вас.
настолько банально,
что лично вы не в состоянии никак этот момент прояснить?

потому что ничего кроме: "так сказал Саттер" вы покамест сообщить не сумели.

да и не сможете вы ничего решительно по этому поводу сказать по одной простой причине:

граммар-конст в данном случае,
не имеет никаких абсолютно отличий за искл.
того, что компилятор осуществит доп. контроль.

я вам выше писал об этом.

до вас так и не дошла эта простая мысль:
это используют те, кому нужен этот доп. контроль.

все остальные соотвественно, могут не использовать.

вот и вся суть. ничего другого здесь нет, и быть не может.

Цитата Сообщение от Avazart Посмотреть сообщение
Слив принят.
деццкий сад.

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Да лабуда это, это не человеческий фактор, а фактор-дебила который и так найдет чем "загнуть" эту ф-цию.
Как можно в пределах ф-ции можно забыть и "случайно" модифицировать ф-цию?
У вас что функции километрами?
как можно в пределах функции забыть освободить память.
как можно в пределах функции забыть проинициализировать переменную.
как можно в пределах функции забыть профакапить эксепшен.

как можно в пределах функции забыть ...

существуют железобетонные гарантии, и существуй человеческий фактор.
а дибил всегда найдется.
да и необязательно для этого быть дибилом.
вполне достаточно быть просто живым человеком.

к тому же, консты упрощают понимание кода.
мы знаем, что у нас тут все статично, ничего не меняется, никаких хз-каких то связей/побочных эффекто нет, и быть не может.
DrOffset
14.07.2015, 22:41
  #19

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Ну так не засовывал свои пять копеек справедливости...
Имею полное право засовывать все, что угодно, до тех пор, пока оно не нарушает законодательство РФ и правила данного форума.
Мы в техническом разделе. Здесь могут быть разные мнения, в том числе нейтральные. Если нужны только согласие или только оппозиция, то у нас есть другие разделы.
Я высказал свое мнение о том, что явление не выдумано, и что некоторые им пользуются, а некоторые даже рекомендуют. Еще дал пару ссылок на обсуждение, там разные мнения, которые совпадают с твоим и нет. Опять же затем, чтобы обозначить, что данная проблема не однозначна и с обеих сторон (за и против) достаточно людей.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2015, 22:56     Const-параметры в аргументах функции
Еще ссылки по теме:

C++ int const * const foo(const int* param) const - разъясните значение квалификаторов
Const после функции C++
C++ Отличие Myclass& от Myclass* в аргументах функции

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
14.07.2015, 22:56  [ТС]     Const-параметры в аргументах функции #20
Цитата Сообщение от DrOffset Посмотреть сообщение
Я высказал свое мнение о том, что явление не выдумано, и что некоторые им пользуются, а некоторые даже рекомендуют.
Как бы быстро увиливаете от морали до закона РФ )))
Это не ваше мнение, а вырванная "цитата" Маерса, при чем искаженное, т.е деза.
На что вам я указал. Вероятно если Маерс рекомендовал бы то и сам бы использовал бы в коде, но код из книги говорит об обратном.
Логично что если вы что-то утверждаете то приводить аргументы/примеры а не закидывать:
Цитата Сообщение от DrOffset Посмотреть сообщение
Я видел проекты целиком оформленные таким образом.
А я к примеру не видел? И что ваша нейтральная точка зрения мешает вам поделится ссылкой на такой проект?

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
потому что ничего кроме: "так сказал Саттер" вы покамест сообщить не сумели.
Я уже давно сообщил, но вы по прежнему продолжая защищать свой код и сводя беседу в крайности.
Yandex
Объявления
14.07.2015, 22:56     Const-параметры в аргументах функции
Ответ Создать тему
Опции темы

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