Bagaimana cara meneruskan argumen opsional ke metode di C ++?

113

Bagaimana cara meneruskan argumen opsional ke metode di C ++? Semua potongan kode ...

Swapnil Gupta
sumber
9
Anda tidak melewatkan parameter opsi. Anda memberikan argumen opsional!
Chubsdad
Untuk kontrol yang lebih eksplisit daripada yang disediakan dengan menyimpan nilai sentinel, lihat boost :: opsional <>.
Tony Delroy

Jawaban:

145

Berikut adalah contoh mode passing sebagai parameter opsional

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

Anda dapat memanggil myfunc dengan kedua cara dan keduanya valid

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1
Pramendra Gupta
sumber
Bisakah Anda memberikan beberapa contoh yang terkait dengan string?
Swapnil Gupta
void myfunc (int blah, char mode [] = NULL)
Pramendra Gupta
2
NULLberarti pointer NULL, meskipun itu akan didefinisikan sebagai literal 0. Ini bukan nama universal untuk nol konstan. Untuk bilangan bulat (non-pointer) Anda harus menggunakan nomor: int mode = 0.
UncleBens
1
Jika Anda bekerja dengan sebuah kelas (file sumber dan header), di mana Anda akan menentukan nilai default?
AceFunk
2
@AceFunk Sangat terlambat, tetapi kode yang saya lihat memiliki nilai default yang ditentukan di header. Jika Anda memikirkannya, sistem tidak akan tahu bahwa Anda dapat menghilangkan nilai jika opsional ditentukan dalam sumber
Mars
50

Aturan penting sehubungan dengan penggunaan parameter default:
Parameter default harus ditentukan di ujung paling kanan, setelah Anda menentukan parameter nilai default, Anda tidak dapat menentukan parameter non default lagi. ex:

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

int DoSomething(int x, int z, int y = 10) -----------> Allowed 
Alok Save
sumber
@Chubsdad - Ahh .. pernyataan ambigu saya yang buruk! apakah pernyataan kedua menjumlahkannya dengan benar? "setelah Anda menentukan parameter nilai default, Anda tidak dapat menentukan parameter non default lagi"
Simpan Alok
1
Jadi, jika saya mengerti dengan benar jika saya memiliki beberapa parameter opsional, saya harus menerapkan semuanya atau tidak sama sekali? Saya tidak dapat memilih untuk menggunakan 1 parameter opsional tetapi bukan yang lainnya?
Gerard
@Gerard: Contoh "Diizinkan" menampilkan satu parameter opsional dan bukan kasus penggunaan lainnya yang valid.
Alok Save
4
Saya mengerti, tetapi bagaimana jika saya memiliki int foo(int x, int y = 10, int z = 10)dan ingin menelepon foo(1,2), jadi hanya memberikan satu parameter opsional. Saya tampaknya tidak bisa membuatnya bekerja sendiri.
Gerard
30

Mungkin menarik bagi sebagian dari Anda bahwa jika ada beberapa parameter default:

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

Diberikan panggilan fungsi berikut:

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

Output berikut dihasilkan:

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

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

pengguna2008151314
sumber
1
Inilah yang saya cari. Gunakan satu fungsi yang dapat menangani sejumlah argumen berbeda. Deklarasikan fungsi dengan nilai default di file header kemudian tentukan tanpa Parameter default dan kemudian Anda dapat menggunakannya. Tidak perlu membuat fungsi kelebihan beban
Teh Sunn Liu
15

Gunakan parameter default

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

}

Catatan: Berikut ini adalah format yang salah

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

template <typename T>
void func(T a, T b = a )
Prasoon Saurav
sumber
Terima kasih atas solusi umum, saya mencoba mencari cara untuk memberikan nilai default untuk semua jenis sembarang.
Anonim
13

Untuk mengikuti contoh yang diberikan di sini, tetapi untuk memperjelas sintaks dengan penggunaan file header, deklarasi fungsi maju berisi nilai default parameter opsional.

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
sumber
10

Dengan koma yang memisahkannya, seperti parameter tanpa nilai default.

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
Ben Voigt
sumber
9

Biasanya dengan menyetel nilai default untuk parameter:

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;
}
Jerry Coffin
sumber
8

Dengan diperkenalkannya std :: opsional di C ++ 17, Anda dapat meneruskan argumen opsional:

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

Keluaran:

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

Lihat https://en.cppreference.com/w/cpp/utility/optional

Fernando G. Testa
sumber