C ++: я должен как можно больше использовать константы в аргументах функции? - PullRequest
0 голосов
/ 15 декабря 2010

Или это бессмысленно?

Спасибо.

Редактировать: Я видел массивы символов, часто постоянные в аргументах функций ... есть ли причина для этого?

Правка 2: не берите в голову мою правку. См. «In silico's answer.

»

Редактировать 3: УТОЧНИТЬ, это вопрос этикета, а не вопрос «что произойдет». Я понимаю, что делает const.

Ответы [ 3 ]

4 голосов
/ 15 декабря 2010

Рассмотрим это объявление функции:

void Foo(const char* str);

Здесь объявляется функция с именем foo, которая принимает указатель на const char. const в этом контексте означает, что функция обещает не изменять содержимое материала, указанного str.

Это связано с const-правильностью и является фундаментальной частью языка. Тот факт, что вам пришлось просить что-то относительно простое, означает, что вы должны пойти , взять хорошую книгу по C ++ и прочитать ее. Вы получите намного лучшее понимание того, как его использовать и почему мы даже беспокоимся об этом.

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

0 голосов
/ 15 декабря 2010

const - это обещание, что вы не измените эту вещь. Вы можете давать обещания не изменять параметр, не изменять то, на что указывает указатель (или ссылка ссылается), не изменять this -объект (в функции-члене) и т. Д. Для возвращаемого значения "обещание" является обязательным для вызывающей стороны, так что на самом деле это больше похоже на то, что вы не разрешаете вызывающей стороне изменять возвращаемую вещь.

Это более полезно с указателями и ссылками (особенно ссылками, поскольку в C ++ мы предпочитаем не передавать по указателю, если нам это не нужно), чем со значениями, поскольку передача по значению в любом случае делает копию; вызывающая сторона не заботится, меняет ли вызываемая функция свою собственную копию значения. Но если мы передадим по ссылке, const даст нам знать, что функция не изменит наше значение через ссылку.

Точно так же, когда мы возвращаем что-то по ссылке, мы обычно ссылаемся на уже существующую вещь - возможно, чаще всего, мы возвращаем некоторый элемент данных по ссылке из функции-члена. В этом случае const запрещает вызывающей стороне использовать эту ссылку для изменения объекта. Это, опять же, облегчает рассуждения о том, что делает код, и защищает от ошибок. Обычно функции доступа доступны парами: одна неконстантная версия и одна константная версия, где и возвращаемое значение, и объект this являются const. (Мы создаем this-объект const, помещая const в end сигнатуры функции, после закрывающей скобки списка параметров.) Значение: "вызов этой функции не повлияет на объект, если вызывающая сторона не изменяет объект через возвращенную ссылку ". Если у вызывающей стороны есть экземпляр const класса, тогда может быть возвращена только ссылка на const.

Подробнее читайте http://www.parashift.com/c++-faq-lite/const-correctness.html.

0 голосов
/ 15 декабря 2010

Используйте const всякий раз, когда вы имеете дело со ссылками (&) и не собираетесь изменять аргумент.Это для того, чтобы четко идентифицировать их как входные аргументы.Производительность тоже должна быть лучше.И тысячи других причин.Это, вероятно, бесполезно для аргументов, передаваемых по значению, но также не повредит.

...