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


113

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


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

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 

@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/


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 )

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

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

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.