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

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)
{

}

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

112 голосов | спросил httpinterpret 16 Mayam10 2010, 11:31:48

4 ответа


0

Если вы поместите объявление в заголовочный файл, а определение - в отдельный файл .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);
ответил Greg Hewgill 16 Mayam10 2010, 11:38:32
0

В 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)
{
  // ...
}

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

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

ответил AnT 16 Mayam10 2010, 11:49:21
0

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

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

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

ответил user342264 16 Mayam10 2010, 11:43:42
0

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

ответил clyfe 16 Mayam10 2010, 11:40:09

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132