Як передати необов'язкові аргументи методу в C ++?


112

Як передати необов'язкові аргументи методу в C ++? Будь-який фрагмент коду ...


9
Параметри опції не передаються. Ви передаєте необов'язкові аргументи!
Чубсдад

Для більш чіткого контролю, ніж той, який забезпечується резервуванням дозорних значень, перевірте boost :: необов'язково <>.
Тоні Делрой

Відповіді:


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

2
@AceFunk Super пізно, але код, який я бачив, має значення за замовчуванням, визначене у заголовку. Якщо ви подумаєте про це, система не знала б, що ви можете опустити значення, якби опція була визначена в джерелі
Марс

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: Приклад "Дозволено" показує один необов'язковий параметр, а не решту випадків використання, які є дійсними.
Алок Зберегти

4
Я розумію, але що робити, якщо я мав би int foo(int x, int y = 10, int z = 10)і хотів би зателефонувати foo(1,2), тому даю лише один необов'язковий параметр. Я, здається, не зміг би змусити себе працювати.
Джерард

30

Для когось із вас може бути цікаво, що у випадку кількох параметрів за замовчуванням:

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
Це те, що я шукав. Використовуйте одну функцію, яка може обробляти різну кількість аргументів. Оголосити функцію зі значенням за замовчуванням у файлі заголовка, а потім визначити її без параметрів за замовчуванням, а потім можна використовувати її. Не потрібно робити перевантаження функцій
Teh Sunn Liu

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 )

Дякую за загальне рішення, я намагався розібратися, як надати значення за замовчуванням для будь-якого довільного типу.
Анонім

13

Щоб наслідувати наведений тут приклад, але для уточнення синтаксису з використанням файлів заголовка, функція переадресації функції містить необов'язкове значення параметра за замовчуванням.

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 :: необов'язково в 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.