Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
1

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

13.07.2015, 19:19. Показов 4397. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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;  }
Зачем дублировать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2015, 19:19
Ответы с готовыми решениями:

Модификатор const в аргументах функций
Постоянно путаюсь в этих константах. Как писать грамотнее? Вот так: template<typename...

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

const& и const* в имени функции
Объясните пожалуйста что значит const& и const* в имени и параметрах функции(пример из...

Ошибка в аргументах функции
Мне нужно сделать 2 функции поиска индексов максимального и минимального элементов но почему то при...

31
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2015, 19:25 2
Цитата Сообщение от Avazart Посмотреть сообщение
А тут уже const излишен, перебор.
технически - да, излишний.

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

пример:

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

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

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

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

в этом смысле замечание верное.
совершенно не зачем.
мутабельные геттеры можно удалить.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2015, 19:35  [ТС] 3
Цитата Сообщение от hoggy Посмотреть сообщение
однако, квалификатор конст нужен не компилятору, а человеку.
граммар-конст подразумевает по максимому использовать константы.
Как раз человеку он навиг не нужен.

http://bookscafe.net/read/satt... idp1114480

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
чего дублировать?
вы имеете ввиду, зачем мутабельный геттер, если есть сеттер?
в этом смысле замечание верное.
совершенно не зачем.
мутабельные геттеры можно удалить.
Вероятно что-то одно стоит использовать пару гетер/сеттер и или пару по ссылке/константной ссылке.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2015, 20:02 4
Цитата Сообщение от Avazart Посмотреть сообщение
Как раз человеку он навиг не нужен.
1.
здрасти приехали.
вы ещё скажите, что модификаторы доступа public/protected/private
тоже нафиг человеку не нужны.

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

2.
при этом вы аппелируете к Саттеру,
который как раз таки призывает к граммар-конст.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2015, 20:38  [ТС] 5
Цитата Сообщение от hoggy Посмотреть сообщение
при этом вы аппелируете к Саттеру,
который как раз таки призывает к граммар-конст.
От туда
Пример. Избегайте const в объявлениях функций, принимающих параметры по значению.
Мы рекомендуем объявлять функции без таких высокоуровневых модификаторов const, чтобы тот, кто читает ваши заголовочные файлы, не был дезориентирован.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2015, 20:44 6
Цитата Сообщение от Avazart Посмотреть сообщение
Мы рекомендуем объявлять функции без таких высокоуровневых модификаторов const, чтобы тот, кто читает ваши заголовочные файлы, не был дезориентирован.
интересно, и чем это таким он может быть дезоринтирован?
передавать константу, а потом снимать конст при помощи const_cast - вот это - дезориентация.

оттуда же:

Однако использование такого модификатора имеет значение в определении функции и его применение может быть оправдано с точки зрения обнаружения непреднамеренного изменения переданного параметра:
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2015, 20:50  [ТС] 7
Цитата Сообщение от hoggy Посмотреть сообщение
оттуда же:
Однако использование такого модификатора имеет значение в определении функции и его применение может быть оправдано с точки зрения обнаружения непреднамеренного изменения переданного параметра:
Речь шла о
C++
1
void setPrice(const int _price) { m_price = _price; }
Где тут нужен запрет модификации?

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
интересно, и чем это таким он может быть дезоринтирован?
Излишеством, да и ф-ция не становится короче/лаконичнее от таких записей.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.07.2015, 12:33 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 в указателях дезорентирует
(новички часто путаются: справа/слева от звездочки).

на самом деле это - синтаксис языка.
не больше и не меньше.
2
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2015, 13:02  [ТС] 9
Я указал на конкретную ф-цию, так что не нужно съесжать и выдумывать/впадать в крайности и писать про const с указателями.
По моему логично что все лишние телодвижения дезаориентируют.

Не по теме:


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



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

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

void Fun(const int x); // Объявление той же самой функции:
// const здесь игнорируется
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.07.2015, 19:49 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



0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2015, 19:58  [ТС] 11
Цитата Сообщение от hoggy Посмотреть сообщение
но вы же этого не написали.
единственный ваш довод: "так сказал Саттер".
а если бы Саттер сказал: "убейтесь все об стенку"?
Вообще то что сказал Саттер довольно банально, но вероятно не для вас.

Цитата Сообщение от hoggy Посмотреть сообщение
гарантирует (путем исключения человеческого фактора) четкое разделение данных:
на внутреннее состояние автомата, и входные/выходные параметры.
что привентивно сокращает стоимость отладки и сопровождения.
Да лабуда это, это не человеческий фактор, а фактор-дебила который и так найдет чем "загнуть" эту ф-цию.
Как можно в пределах ф-ции можно забыть и "случайно" модифицировать ф-цию?
У вас что функции километрами?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
14.07.2015, 21:14 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, чем к чему-то еще. Вполне имеет право на существование. Я видел проекты целиком оформленные таким образом.

Я думаю, эта тема не стоит таких ожесточенных споров.
Так что, ребята, давайте закругляться, а то придется вырезать ваши разговоры и выпуливать их в священные войны.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2015, 21:43  [ТС] 13
Цитата Сообщение от DrOffset Посмотреть сообщение
Справедливости ради, Скотт Мэйерс придерживается схожего с твоим оппонентом мнения (Effective С++, third edition).
Справедливости ради стоило прочитать ссылку на Саттера для начала он говорит ровным счетом тоже самое, но только с поправками, но кому для понимания банальщины и этого мало. Ну до ладно...

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

Я не говорю, что я согласен с ним, но и не говорю, что не согласен. Я привел источник, выводы делай из него сам. А подобные споры меня интересуют мало.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2015, 22:09  [ТС] 15
Слив принят.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
14.07.2015, 22:18 16
Цитата Сообщение от Avazart Посмотреть сообщение
Слив принят.
Детский сад какой-то, ей-богу. Общаться нормально вообще разучились?

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

Прежде чем мне писать ответ, подумай о том, что помимо "за" и "против" может быть нейтральное мнение. У меня как раз такое. Сам я так не пишу, но другим бы запрещать не стал.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2015, 22:23  [ТС] 17
Цитата Сообщение от DrOffset Посмотреть сообщение
Общаться нормально вообще разучились?
Ну так не засовывал свои пять копеек справедливости...
А потом мол Понтий Пилат умывает руки, и чет про нейтральное мнение ...
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.07.2015, 22:33 18
Цитата Сообщение от Avazart Посмотреть сообщение
Вообще то что сказал Саттер довольно банально, но вероятно не для вас.
настолько банально,
что лично вы не в состоянии никак этот момент прояснить?

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

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

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2015, 22:56  [ТС] 20
Цитата Сообщение от DrOffset Посмотреть сообщение
Я высказал свое мнение о том, что явление не выдумано, и что некоторые им пользуются, а некоторые даже рекомендуют.
Как бы быстро увиливаете от морали до закона РФ )))
Это не ваше мнение, а вырванная "цитата" Маерса, при чем искаженное, т.е деза.
На что вам я указал. Вероятно если Маерс рекомендовал бы то и сам бы использовал бы в коде, но код из книги говорит об обратном.
Логично что если вы что-то утверждаете то приводить аргументы/примеры а не закидывать:
Цитата Сообщение от DrOffset Посмотреть сообщение
Я видел проекты целиком оформленные таким образом.
А я к примеру не видел? И что ваша нейтральная точка зрения мешает вам поделится ссылкой на такой проект?

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
потому что ничего кроме: "так сказал Саттер" вы покамест сообщить не сумели.
Я уже давно сообщил, но вы по прежнему продолжая защищать свой код и сводя беседу в крайности.
0
14.07.2015, 22:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2015, 22:56
Помогаю со студенческими работами здесь

Вычисления функции при заданных аргументах
Написать программу вычисления функции при заданных значениях аргументов. Результаты вывести экран...

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

Вычислить значение функции при разных аргументах, Visual C++
Всем привет! Нужно написать программку на вычисление функции, но незнаю с чего начать и чем...

Как узнать параметры изображения, если оно представлено в виде const void* и размера данных
Доброго. Собственно проблема в шапке. Файл изображения скачивается из интернета. Смотрел в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru