Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Применяется const в параметрах функции? 
:(
    Опции темы
baldina
Дата 9.9.2014, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Lukkoye, ход вашей мысли понятен и возражений по сути ситуаций, выстреливающих в ногу, не вызывает. но пример ваш аналогичен
Код

void foo () {
  int x=...;
  try {
     while (x)
       bar(--x);
  } catch (...) {
     baz(x);
  }
}
vs
void foo () {
  const int x=...;
  try {
     int y=x;
     while (y)
       bar(--y);
  } catch (...) {
     baz(x);
  }
}

и имхо к константности аргумента функции не относится.
что касается const вообще - да, чем меньше переменных, тем меньше ошибок.


Это сообщение отредактировал(а) baldina - 9.9.2014, 10:30
PM MAIL   Вверх
Lukkoye
Дата 9.9.2014, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: нет
Всего: 1



Цитата(baldina @  9.9.2014,  10:29 Найти цитируемый пост)
и имхо к константности аргумента функции не относится.


Относится. Его использование обусловлено причинами, по которым квалификатор const вообще ввели в язык.
А его ввели не для машины - для человека.

Задача квалификатора не просто улучшать читабельность лучше передавая намерения автора кода.
Его главная задача - предостеречь от ничайных ошибок.

Так например, передав аргумент по значению, как константный, вы получаете 100% гарантию от компилятора, что никто ничайно не перетрет его.

Вы конечно можете дать себе торжественную клятву, что никогда не будете перетирать аргумент. И там где надо - обязательно сделаете дополнительную копию.
Но это - человеческий фактор. Только компилятор может дать вам 100% гарантии.
PM MAIL   Вверх
baldina
Дата 9.9.2014, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Lukkoye @  9.9.2014,  11:48 Найти цитируемый пост)
Так например, передав аргумент по значению, как константный, вы получаете 100% гарантию от компилятора, что никто ничайно не перетрет его.

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

Цитата(Lukkoye @  9.9.2014,  11:48 Найти цитируемый пост)
А его ввели не для машины - для человека.

читабельность интерфейса важнее читабельности реализации. или нет? хорошо ли интерфейсу отражать реализацию? нужно ли пользователю интерфейса знать о деталях реализации, например, что реализация не будет использовать аргумент как изменяемую переменную? не нарушается ли при этом принцип инверсии зависимостей?
PM MAIL   Вверх
baldina
Дата 9.9.2014, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



что бы удовлетворить все стороны, не используем const в прототипе, но используем в реализации http://ideone.com/KKjcJa


Это сообщение отредактировал(а) baldina - 9.9.2014, 16:52
PM MAIL   Вверх
Lukkoye
Дата 9.9.2014, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: нет
Всего: 1



Цитата(baldina @  9.9.2014,  16:52 Найти цитируемый пост)
что бы удовлетворить все стороны, не используем const в прототипе, но используем в реализации http://ideone.com/KKjcJa


Прототип вводит в заблуждение.




PM MAIL   Вверх
sQu1rr
Дата 9.9.2014, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(Lukkoye @  9.9.2014,  20:39 Найти цитируемый пост)
Прототип вводит в заблуждение.


Цитата(baldina @  9.9.2014,  15:54 Найти цитируемый пост)
вызывающей стороне на это наплевать, т.к. она от этого никак не зависит. поэтому, кстати, вопрос и не относится к гарантиям интерфейса


Тот кто мейнтейнит реализацию и так знает что это конст, ведь в той частт кода что он правит видно что это конст
Тот кто вызывает функцию, и так понимает что если это не ссылка и не указатель то его значение не затрется. А что там делается в функции это не его дело вообще
PM MAIL Skype GTalk   Вверх
Lukkoye
Дата 9.9.2014, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: нет
Всего: 1



Цитата(sQu1rr @  9.9.2014,  21:47 Найти цитируемый пост)
А что там делается в функции это не его дело вообще 


Не дает индульгенцию на _г_о_в_н_о_код.

Код пишится один раз. И много-много раз читается.


К тому же так писать банально не удобно.
Удобно написать прототип, а потом скопипастить его для реализации, и не тратить время на коверканье нормального кода превращая его в УГ.


Это сообщение отредактировал(а) Lukkoye - 9.9.2014, 22:55
PM MAIL   Вверх
kemiisto
Дата 9.9.2014, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(Lukkoye @  9.9.2014,  19:39 Найти цитируемый пост)
Прототип вводит в заблуждение.

Нет, не так. Если в заблужление что и вводит, то определение, а не объявление функции. smile 

Вот, посмотрите на объявление функции:
Код
int foo (int x);

Передаём же по значению, так? Значит, фактический параметр скопируется в формальный при передаче. И, как следствие, фактический параметр измениться не может. Потому что по значению передаём, а не по ссылке.
Никаких заблуждений же! Всё так и будет независимо от наличия const в последующем определении функции.

А вот когда посмотрим на то, как функция реализована, увидим там const
Код
int foo (const int x) { ... }

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

Что даёт неизменность формального параметра? Ну, анализировать функцию вроде как проще, так как на такие параметры можно почти не обращать внимания. Но я сомневаюсь в полезности. Всё-таки постоянство формального параметра - детали реализации и выносить их в интерфейс (то есть уже в объявлении писать const) не стоит. И уж, конечно, не стоит иметь разногласия между интерфейсом и реализацией (как в примере у baldina).

Мейрса уже цитировал, надо бы и Саттера что-ли.  smile 
Цитата
Normally const pass-by-value is unuseful and misleading at best.

В вольном переводе
Цитата
Обычно передача параметров по константному значению бесполезна и в лучшем случае вводит в заблуждение.


Это сообщение отредактировал(а) kemiisto - 9.9.2014, 23:22


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Lukkoye
Дата 10.9.2014, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: нет
Всего: 1



Цитата(kemiisto @  9.9.2014,  23:19 Найти цитируемый пост)
 Если в заблужление что и вводит, то определение, а не объявление функции


Не принципиально.


Цитата(kemiisto @  9.9.2014,  23:19 Найти цитируемый пост)
Передаём же по значению, так? Значит, фактический параметр скопируется в формальный при передаче. И, как следствие, фактический параметр измениться не может.


Измениться может переданный аргумент.

Мне как то не хочется по второму кругу начинать тоже самое. Читайте предысторию сообщениями раннее.

К тому же:
Код

int foo (int x);


Прототип замалчивает свои намерения: то ли он собирается перетирать аргумент. Толи писал г_о_в_н_о_кодер.

Некоторые ссылки передают изменяемые. Хотя и без намерения их изменять. Такие обычно однозначно производят впечатление джамшутов.

С аргументами-по-значению не так критично, но аналогия та же самая.

Добавлено @ 00:46
Цитата(kemiisto @  9.9.2014,  23:19 Найти цитируемый пост)
В вольном переводе


О пользе я уже написал.

Насчет заблуждений - любопытно узнать, какие тут могут быть заблуждения?

Вы видите прототип:

Код

void foo(const arg); 


А теперь расскажите мне, какие заблуждения у вас могут возникнуть при чтении этого кода?

Саттер  (это ведь он, если не ошибаюсь, писал, что не осилил смысла протектед-наследования? ) меня разочаровывает.

Добавлено через 9 минут и 48 секунд
Цитата(kemiisto @  9.9.2014,  23:19 Найти цитируемый пост)
и узнаем, вроде как сверх того что уже знаем, что и формальный параметер тоже измениться не может.


Что такое "формальный параметр" ?

Это сообщение отредактировал(а) Lukkoye - 10.9.2014, 00:51
PM MAIL   Вверх
sQu1rr
Дата 10.9.2014, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(Lukkoye @  10.9.2014,  00:42 Найти цитируемый пост)
Прототип замалчивает свои намерения: то ли он собирается перетирать аргумент. Толи писал г_о_в_н_о_кодер.

Так смысл в том что вызывающей стороне все равно что случится с аргументом внутри функции, а вообще, что я объясняю

Цитата(Lukkoye @  10.9.2014,  00:42 Найти цитируемый пост)
Мне как то не хочется по второму кругу начинать тоже самое. Читайте предысторию сообщениями раннее.

Мне кажется это вас в большей степени касается.
PM MAIL Skype GTalk   Вверх
Guinness
Дата 10.9.2014, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(Lukkoye @  10.9.2014,  01:42 Найти цитируемый пост)
Насчет заблуждений - любопытно узнать, какие тут могут быть заблуждения?
Вы видите прототип:
Код

void foo(const arg); 

А теперь расскажите мне, какие заблуждения у вас могут возникнуть при чтении этого кода?

Автор, скорее всего, забыл указать, что это константная ссылка, значит функция работает некорректно. Вообще, такие вещи определяются стандартам кодирования на предприятии, если у всех программистов общепринято так писать, то, наверное, данный код будет восприниматься адекватно. Хотя, как по мне, в данном случае, клиенту, пользующимся данным интерфейсом, глубоко по барабану, изменяется ли входной параметр внутри функции или нет, т.к. переданная им переменная для него не изменится.
Цитата(Lukkoye @  10.9.2014,  01:42 Найти цитируемый пост)
Саттер  (это ведь он, если не ошибаюсь, писал, что не осилил смысла протектед-наследования? ) меня разочаровывает.

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

PM MAIL   Вверх
kemiisto
Дата 10.9.2014, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(Lukkoye @  9.9.2014,  23:42 Найти цитируемый пост)
Прототип замалчивает свои намерения: то ли он собирается перетирать аргумент. Толи писал г_о_в_н_о_кодер.

Lukkoye, у меня для Вас плохие новости: Вы не понимаете механизма передачи параметра функции по значению. Ещё раз для Вас повторю: при передаче по значению фактический параметр копируется в формальный, и далее, какие-бы изменения с формальным параметром не произошли, на фактическом параметре они никак не отразяться.

Цитата(Lukkoye @  9.9.2014,  23:42 Найти цитируемый пост)
Что такое "формальный параметр" ?

И этот юзернейм критикует Саттера?! smile В объявлении функции фигурируют формальные параметры, а передаются в неё в клиентском коде фактические. То есть, в объявлении, скажем,
Код
int foo(int x);

x - формальный параметр, а при вызове такой функции
Код
int a = 0;
int result = foo(a);(

a - фактический параметр.

И ещё раз, уже на этом конкретном примере: значение фактического параметра a, передающегося по значению, поменяться ну никак не может, так как при вызове функции оно будет скопировано в формальный параметр x. Значение формального параметра x при этом может измениться, но на вызывающей стороне это никак не скажеться. Ничего Вы там не перетрёте, не болтайте ерундой.

Добавлено через 1 минуту и 3 секунды
Цитата(Guinness @  10.9.2014,  06:43 Найти цитируемый пост)
Хотя, как по мне, в данном случае, клиенту, пользующимся данным интерфейсом, глубоко по барабану, изменяется ли входной параметр внутри функции или нет, т.к. переданная им переменная для него не изменится.

Ему уже как-бы 2 страницы пытаются это объяснить. 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
math64
Дата 10.9.2014, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



const в java соответсвует final.
Если параметр объявлен final, анонимный класс, создаваемый в методе, имеет к нему доступ:
Код

public class C {
public getX() { return x; }
private int x = 0;
}
int foo(final int x) {
   C c = new C() { public int getX() { return x; } }
   return c.getX();
}

T.o. лишние final могут быть вредны с точки зрения обнаружения ошибок в коде.
Вероятно подобные примеры можно найти в C++ (с учётом наличия лямбда выражений, шаблонов и т.п.)
PM   Вверх
kemiisto
Дата 10.9.2014, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(math64 @  10.9.2014,  09:17 Найти цитируемый пост)
const в java соответсвует final

Ничего подобного. Там столько различий, что надоест перечислять. Тут с одним С++ то разобраться не можем. smile 

Это сообщение отредактировал(а) kemiisto - 10.9.2014, 10:38


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Lukkoye
Дата 10.9.2014, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: нет
Всего: 1



Цитата(kemiisto @  10.9.2014,  09:41 Найти цитируемый пост)
Lukkoye, у меня для Вас плохие новости: Вы не понимаете механизма передачи параметра функции по значению. Ещё раз для Вас повторю: при передаче по значению фактический параметр копируется в формальный, и далее, какие-бы изменения с формальным параметром не произошли, на фактическом параметре они никак не отразяться.


У меня тоже для вас плохие новости - вы невнимательный. Вы не читали предысторию.

Предлагаю вам хотя бы перечитать мою переписку с господином baldina, прежде чем делать выводы о незнакомом вам человеке на основании одних лишь своих домыслов.

Цитата(kemiisto @  10.9.2014,  09:41 Найти цитируемый пост)
 объявлении функции фигурируют формальные параметры, а передаются в неё в клиентском коде фактические. То есть, в объявлении, скажем,


Ясно. Спасибо.

Возвращаясь к вашей цитате:
Цитата(kemiisto @  9.9.2014,  23:19 Найти цитируемый пост)
и узнаем, вроде как сверх того что уже знаем, что и формальный параметер тоже измениться не может.


Эта полезная информация. Мы можем не вникать в детали без необходимости, но мы знаем, и нам это гарантирует компилятор - формальный параметр ни при каких обстоятельствах не будет перетерт.
А это значит, что функция дает нам строгие гарантии.

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

Цитата(kemiisto @  10.9.2014,  09:41 Найти цитируемый пост)
Ему уже как-бы 2 страницы пытаются это объяснить.  


Это если только в стране фей.

На практике же, как дойдет дело то кодовой базы, которую пилит куча народу - чем более самодокументируемый и безопасный код - тем лучше во всех смыслах.





Это сообщение отредактировал(а) Lukkoye - 10.9.2014, 18:15
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1827 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.