Как передать необязательные аргументы методу в 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/


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 )

Спасибо за общее решение, я пытался выяснить, как предоставить значение по умолчанию для любого произвольного типа.
— Аноним

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();
}

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.