Как передать необязательные аргументы методу в C ++?

112

Как передать необязательные аргументы методу в C ++? Любой фрагмент кода ...

Свапнил Гупта
источник
9
Вы не передаете параметры опции. Вы передаете необязательные аргументы!
Chubsdad
Для более явного контроля, чем тот, который обеспечивается резервированием контрольных значений, проверьте boost :: optional <>.
Тони Делрой,

Ответы:

145

Вот пример режима передачи в качестве необязательного параметра

void myfunc(int blah, int mode = 0)
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

вы можете вызвать myfunc обоими способами, и оба действительны

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1
Прамендра Гупта
источник
Не могли бы вы привести пример, связанный со строкой?
Swapnil Gupta,
void myfunc (int blah, char mode [] = NULL)
Pramendra Gupta,
2
NULLозначает указатель NULL, даже если он будет определен как буквальный 0. Это не универсальное название постоянного нуля. Для целых чисел (не-указатели) , вы должны использовать цифры: int mode = 0.
UncleBens,
1
Если вы работаете с классом (исходный и заголовочный файлы), где бы вы определяли значение по умолчанию?
AceFunk
3
@AceFunk Супер поздно, но код, который я видел, имеет значение по умолчанию, определенное в заголовке. Если задуматься, система не узнала бы, что вы можете опустить значение, если бы необязательный параметр был определен в источнике
Марс
50

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

int DoSomething(int x, int y = 10, int z) -----------> Not Allowed

int DoSomething(int x, int z, int y = 10) -----------> Allowed 
Алок Сохранить
источник
@Chubsdad - Ах, мое плохое двусмысленное заявление! правильно ли суммирует второе утверждение? «после того, как вы укажете параметр значения по умолчанию, вы не сможете снова указать параметр, отличный от параметра по умолчанию»
Alok Save
1
Итак, если я правильно понимаю, есть ли у меня несколько необязательных параметров, я должен либо реализовать их все, либо вообще ни одного? Я не могу выбрать один необязательный параметр, но не остальные?
Джерард
@Gerard: Пример «Разрешено» показывает один необязательный параметр, а не остальные допустимые варианты использования.
Alok Save
4
Я понимаю, но что, если бы у меня был int foo(int x, int y = 10, int z = 10)и я бы хотел позвонить foo(1,2), поэтому давал только один необязательный параметр. Кажется, я сам не смог заставить его работать.
Джерард
31

Некоторым из вас может быть интересно, что в случае нескольких параметров по умолчанию:

void printValues(int x=10, int y=20, int z=30)
{
    std::cout << "Values: " << x << " " << y << " " << z << '\n';
}

Учитывая следующие вызовы функций:

printValues(1, 2, 3);
printValues(1, 2);
printValues(1);
printValues();

Создается следующий вывод:

Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30

Ссылка: http://www.learncpp.com/cpp-tutorial/77-default-parameters/

user2008151314
источник
1
Это то, что я искал. Используйте одну функцию, которая может обрабатывать разное количество аргументов. Объявите функцию со значением по умолчанию в файле заголовка, затем определите ее без параметров по умолчанию, и тогда вы сможете ее использовать. Нет необходимости делать перегрузку функций
Дэ Сунн Лю
15

Использовать параметры по умолчанию

template <typename T>
void func(T a, T b = T()) {

   std::cout << a << b;

}

int main()
{
    func(1,4); // a = 1, b = 4
    func(1);   // a = 1, b = 0

    std::string x = "Hello";
    std::string y = "World";

    func(x,y);  // a = "Hello", b ="World"
    func(x);    // a = "Hello", b = "" 

}

Примечание. Следующие элементы имеют неверный формат.

template <typename T>
void func(T a = T(), T b )

template <typename T>
void func(T a, T b = a )
Prasoon Saurav
источник
Спасибо за общее решение, я пытался выяснить, как предоставить значение по умолчанию для любого произвольного типа.
Аноним
14

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

myfile.h

void myfunc(int blah, int mode = 0);

myfile.cpp

void myfunc(int blah, int mode) /* mode = 0 */
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}
KenJ
источник
10

С разделением запятыми, как с параметрами без значений по умолчанию.

int func( int x = 0, int y = 0 );

func(); // doesn't pass optional parameters, defaults are used, x = 0 and y = 0

func(1, 2); // provides optional parameters, x = 1 and y = 2
Бен Фойгт
источник
9

Обычно при установке значения по умолчанию для параметра:

int func(int a, int b = -1) { 
    std::cout << "a = " << a;
    if (b != -1)        
        std::cout << ", b = " << b;
    std::cout << "\n";
}

int main() { 
    func(1, 2);  // prints "a=1, b=2\n"
    func(3);     // prints "a=3\n"
    return 0;
}
Джерри Гроб
источник
8

С введением std :: optional в C ++ 17 вы можете передавать необязательные аргументы:

#include <iostream>
#include <string>
#include <optional>

void myfunc(const std::string& id, const std::optional<std::string>& param = std::nullopt)
{
    std::cout << "id=" << id << ", param=";

    if (param)
        std::cout << *param << std::endl;
    else
        std::cout << "<parameter not set>" << std::endl;
}

int main() 
{
    myfunc("first");
    myfunc("second" , "something");
}

Вывод:

id=first param=<parameter not set>
id=second param=something

См. Https://en.cppreference.com/w/cpp/utility/optional

Фернандо Г. Теста
источник