Какой смысл выдавать аргумент, который передается значением константы? - PullRequest
0 голосов
/ 18 декабря 2018

Это более общий вопрос: есть ли смысл делать параметр функции const, если он передается по значению?

В коде, который я изучаю, я вижу много следующего:

void some_function(const std::vector<double> some_vec);

std::vector передается по значению, так в чем же тогда смысл const?

Как я понял бы, если бы функция вместо этого передавала вектор по ссылке так:

void some_function(const std::vector<double> &some_vec);

, но я не вижу смысла в const в первом.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

int foo(int x)
{
    /* lots of code */
    some_other_func(x);  // may modify x
    /* even more code */
    return x+42;         // x may have been modified
}

и

int foo(const int x)
{
    /* lots of code */
    some_other_func(x);  // will not compile if x is taken by non-const reference
    /* even more code */
    return x+42;         // x is guaranteed at its input value
}

Как правило, объявляйте все const, что не должно быть изменено.Затем, если вы или кто-то случайно попытаетесь изменить такую ​​переменную, возникнет ошибка времени компиляции.

Обратите также внимание, что декларатор const не действует в объявлении функции, но только в определении функции, то есть следующее прекрасно (на самом деле рекомендуется):

struct bar
{
   int foo(int) const;
   /* more code */
};

int bar::foo(const int x) const // possibly in another compilation unit
{
   ...
}
0 голосов
/ 18 декабря 2018

Может быть очень полезным при работе, в частности, с математическим кодом, так как он мешает ошибочным рефакторингам изменять переменные, передаваемые в качестве параметров функции.Например, вы не хотите возиться со значением pi (что, к сожалению, не является частью стандарта C ++) или такими вещами, как гравитационная постоянная, & c.

(В прошлом я видел , видя pi *= 2;, как код был написан физиком, который был убежден, что pi должно быть вдвое больше, чем у большинства людей.)

Также приятно иметь соответствие определителей в объявлении и определении функции (хотя сам язык на этом не настаивает).

Я не очень часто это использую.

...