Значение по умолчанию параметра функции

1.

int Add (int a, int b = 3);
int Add (int a, int b)
{

}

2.

int Add (int a, int b);
int Add (int a, int b = 3)
{

}

Обе работы; который является стандартным путем и почему?

124
задан River 29 December 2017 в 01:05
поделиться

4 ответа

Если вы поместите объявление в заголовочный файл, а определение в отдельный файл .cpp, и #include заголовок из другого файла .cpp, вы сможете увидеть разницу.

В частности, предположим:

lib.h

int Add(int a, int b);

lib.cpp

int Add(int a, int b = 3) {
   ...
}

test.cpp

#include "lib.h"

int main() {
    Add(4);
}

Компиляция test.cpp не увидит объявления параметра по умолчанию и завершится с ошибкой.

По этой причине определение параметра по умолчанию обычно указывается в объявлении функции:

lib.h

int Add(int a, int b = 3);
194
ответ дан 24 November 2019 в 01:07
поделиться

Первый способ предпочтительнее второго.

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

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

5
ответ дан 24 November 2019 в 01:07
поделиться

В C ++ к аргументам по умолчанию в отношении их расположения в списке параметров предъявляются следующие требования:

  1. Аргумент по умолчанию для данного параметра должен указываться не более одного раза. Задавать его более одного раза (даже с одним и тем же значением по умолчанию) недопустимо.

  2. Параметры с аргументами по умолчанию должны образовывать непрерывную группу в конце списка параметров.

Теперь, имея это в виду, в C ++ вам разрешено «наращивать» набор параметров, которые имеют аргументы по умолчанию, от одного объявления функции к другому, пока вышеуказанные требования постоянно выполняются.

Например, вы можете объявить функцию без аргументов по умолчанию

void foo(int a, int b);

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

Позже (ниже) в той же единице трансляции вы можете повторно объявить ее снова, но на этот раз с одним аргументом по умолчанию

void foo(int a, int b = 5);

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

Далее вы можете повторно объявить его еще раз, добавив еще один аргумент по умолчанию

void foo(int a = 1, int b);

, и с этого момента вы можете вызывать его без явных аргументов.

Полный пример может выглядеть следующим образом

void foo(int a, int b);

int main()
{
  foo(2, 3);

  void foo(int a, int b = 5); // redeclare
  foo(8); // OK, calls `foo(8, 5)`

  void foo(int a = 1, int b); // redeclare again
  foo(); // OK, calls `foo(1, 5)`
}

void foo(int a, int b)
{
  // ...
}

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

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

44
ответ дан 24 November 2019 в 01:07
поделиться

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

4
ответ дан 24 November 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: