C ++ 'da bir yönteme isteğe bağlı bağımsız değişkenler nasıl iletilir?


112

C ++ 'da bir yönteme isteğe bağlı bağımsız değişkenler nasıl iletilir? Herhangi bir kod parçası ...


9
Seçenek parametrelerini geçemezsiniz. İsteğe bağlı argümanlar iletirsiniz!
— Chubsdad

Sentinel değerleri ayırarak sağlanandan daha açık bir kontrol için, boost :: optional <> sayfasına bakın.
— Tony Delroy

Yanıtlar:


145

İşte isteğe bağlı parametre olarak geçiş moduna bir örnek

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

myfunc'ı her iki şekilde de çağırabilirsiniz ve her ikisi de geçerlidir

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1

Lütfen string ile ilgili bir örnek verebilir misiniz?
— Swapnil Gupta

void myfunc (int blah, char mode [] = NULL)
— Pramendra Gupta

2
NULLdeğişmez olarak tanımlansa bile bir BOŞ gösterici anlamına gelir 0. Sabit sıfır için evrensel bir isim değildir. Tamsayılar (non-işaretçiler) için sayıları kullanmalısınız: int mode = 0.
— UncleBens

1
Bir sınıfla (kaynak ve başlık dosyaları) çalışıyorsanız, varsayılan değeri nerede tanımlarsınız?
— AceFunk

2
@AceFunk Çok geç, ancak gördüğüm kod başlıkta tanımlanan varsayılan değere sahip. Düşünürseniz, sistem, isteğe bağlı kaynakta tanımlanmışsa değeri atlayabileceğinizi bilemez
— Mars

50

Varsayılan parametre kullanımına ilişkin önemli bir kural:
Varsayılan parametreler en sağ uçta belirtilmelidir, bir varsayılan değer parametresi belirledikten sonra varsayılan olmayan bir parametreyi tekrar belirtemezsiniz. örn:

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

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

@Chubsdad - Ahh..benim kötü belirsiz söz! ikinci ifade bunu doğru bir şekilde özetliyor mu? "varsayılan bir değer parametresi belirlediğinizde, varsayılan olmayan bir parametreyi tekrar belirleyemezsiniz"
— Alok

1
Öyleyse, eğer birden fazla isteğe bağlı parametrem varsa doğru anlarsam, hepsini uygulamalı mıyım yoksa hiçbirini uygulamamalı mıyım? 1 isteğe bağlı parametre kullanmayı seçemiyorum ama geri kalanını kullanamam?
— Gerard

@Gerard: "İzin Verildi" örneği, geçerli olan geri kalan kullanım durumunu değil, isteğe bağlı bir parametreyi gösterir.
— Alok

4
Anlıyorum, ama ya sahip olsaydım int foo(int x, int y = 10, int z = 10)ve aramak isteseydim foo(1,2), bu yüzden sadece bir isteğe bağlı parametre vermek. Bunu kendi başıma çalıştıracak gibi görünmedim.
— Gerard

30

Birden fazla varsayılan parametre olması durumunda, bazılarınız için ilginç olabilir:

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

Aşağıdaki işlev çağrıları göz önüne alındığında:

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

Aşağıdaki çıktı üretilir:

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

Referans: http://www.learncpp.com/cpp-tutorial/77-default-parameters/


1
Aradığım şey buydu. Farklı sayıda argümanı işleyebilen bir işlev kullanın. Fonksiyonu başlık dosyasında varsayılan değerle bildirin ve ardından varsayılan Parametreler olmadan tanımlayın ve sonra kullanabilirsiniz. Aşırı fonksiyon yüklemeye gerek yok
— Teh Sunn Liu

15

Varsayılan parametreleri kullan

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 = "" 

}

Not: Aşağıdakiler biçimsizdir

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

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

Genel çözüm için teşekkürler, herhangi bir rastgele tür için nasıl varsayılan bir değer sağlayacağımı anlamaya çalışıyordum.
— Anonim

13

Burada verilen örneği takip etmek, ancak üstbilgi dosyalarının kullanımıyla sözdizimini netleştirmek için, işlev ileri bildirimi isteğe bağlı parametre varsayılan değerini içerir.

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

Varsayılan değerleri olmayan parametreler gibi, virgülle ayırarak.

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

Genellikle bir parametre için varsayılan bir değer ayarlayarak:

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

C ++ 17'de std :: Optional ile birlikte isteğe bağlı argümanlar iletebilirsiniz:

#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");
}

Çıktı:

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

Bkz. Https://en.cppreference.com/w/cpp/utility/optional

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.