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

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

Войти
Регистрация
Восстановить пароль
 
 
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
#1

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

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

Цитата Сообщение от 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2015, 19:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Const-параметры в аргументах функции (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,122
Завершенные тесты: 1
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
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
13.07.2015, 19:35  [ТС] #3
Цитата Сообщение от hoggy Посмотреть сообщение
однако, квалификатор конст нужен не компилятору, а человеку.
граммар-конст подразумевает по максимому использовать константы.
Как раз человеку он навиг не нужен.

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

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

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

2.
при этом вы аппелируете к Саттеру,
который как раз таки призывает к граммар-конст.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
13.07.2015, 20:38  [ТС] #5
Цитата Сообщение от hoggy Посмотреть сообщение
при этом вы аппелируете к Саттеру,
который как раз таки призывает к граммар-конст.
От туда
Пример. Избегайте const в объявлениях функций, принимающих параметры по значению.
Мы рекомендуем объявлять функции без таких высокоуровневых модификаторов const, чтобы тот, кто читает ваши заголовочные файлы, не был дезориентирован.
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,122
Завершенные тесты: 1
13.07.2015, 20:44 #6
Цитата Сообщение от Avazart Посмотреть сообщение
Мы рекомендуем объявлять функции без таких высокоуровневых модификаторов const, чтобы тот, кто читает ваши заголовочные файлы, не был дезориентирован.
интересно, и чем это таким он может быть дезоринтирован?
передавать константу, а потом снимать конст при помощи const_cast - вот это - дезориентация.

оттуда же:

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

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
интересно, и чем это таким он может быть дезоринтирован?
Излишеством, да и ф-ция не становится короче/лаконичнее от таких записей.
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,122
Завершенные тесты: 1
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
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
14.07.2015, 13:02  [ТС] #9
Я указал на конкретную ф-цию, так что не нужно съесжать и выдумывать/впадать в крайности и писать про const с указателями.
По моему логично что все лишние телодвижения дезаориентируют.

Не по теме:


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



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

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

void Fun(const int x); // Объявление той же самой функции:
// const здесь игнорируется
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,122
Завершенные тесты: 1
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
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
14.07.2015, 19:58  [ТС] #11
Цитата Сообщение от hoggy Посмотреть сообщение
но вы же этого не написали.
единственный ваш довод: "так сказал Саттер".
а если бы Саттер сказал: "убейтесь все об стенку"?
Вообще то что сказал Саттер довольно банально, но вероятно не для вас.

Цитата Сообщение от hoggy Посмотреть сообщение
гарантирует (путем исключения человеческого фактора) четкое разделение данных:
на внутреннее состояние автомата, и входные/выходные параметры.
что привентивно сокращает стоимость отладки и сопровождения.
Да лабуда это, это не человеческий фактор, а фактор-дебила который и так найдет чем "загнуть" эту ф-цию.
Как можно в пределах ф-ции можно забыть и "случайно" модифицировать ф-цию?
У вас что функции километрами?
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,096
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
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
14.07.2015, 21:43  [ТС] #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Справедливости ради, Скотт Мэйерс придерживается схожего с твоим оппонентом мнения (Effective С++, third edition).
Справедливости ради стоило прочитать ссылку на Саттера для начала он говорит ровным счетом тоже самое, но только с поправками, но кому для понимания банальщины и этого мало. Ну до ладно...

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

Я не говорю, что я согласен с ним, но и не говорю, что не согласен. Я привел источник, выводы делай из него сам. А подобные споры меня интересуют мало.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
14.07.2015, 22:09  [ТС] #15
Слив принят.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2015, 22:09
Привет! Вот еще темы с ответами:

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

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

Отличие Myclass& от Myclass* в аргументах функции - C++
Доброго времени суток. Новичок в С++ (раньше писал на всяких питонах и пхп). Очень нравится язык, прям каждый раз, когда что-то новое...

Const после функции - C++
Здравствуйте! Объясните, пожалуйста, что делает тут const: double GetFrequency () const { return m_frequency; } ...


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

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

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