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.