Làm thế nào để truyền các đối số tùy chọn cho một phương thức trong C ++?


112

Làm thế nào để truyền các đối số tùy chọn cho một phương thức trong C ++? Bất kỳ đoạn mã nào ...


9
Bạn không chuyển các tham số tùy chọn. Bạn vượt qua các đối số tùy chọn!
Chubsdad 24/09/10

Để có sự kiểm soát rõ ràng hơn so với điều kiện được cung cấp bằng cách đặt trước các giá trị sentinel, hãy xem boost :: option <>.
Tony Delroy

Câu trả lời:


145

Đây là một ví dụ về chế độ truyền làm tham số tùy chọn

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

bạn có thể gọi myfunc theo cả hai cách và cả hai đều hợp lệ

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

Bạn có thể cung cấp một số ví dụ liên quan đến chuỗi không?
Swapnil Gupta

khoảng trống myfunc (int blah, chế độ char [] = NULL)
Pramendra Gupta

2
NULLnghĩa là một con trỏ NULL, mặc dù nó sẽ được định nghĩa là theo nghĩa đen 0. Nó không phải là một cái tên phổ biến cho hằng số 0. Đối với số nguyên (không gợi ý), bạn nên sử dụng số: int mode = 0.
UncleBens

1
Nếu bạn đang làm việc với một lớp (tệp nguồn và tệp tiêu đề), bạn sẽ xác định giá trị mặc định ở đâu?
AceFunk

2
@AceFunk Siêu trễ, nhưng mã tôi đã thấy có giá trị mặc định được xác định trong tiêu đề. Nếu bạn nghĩ về điều đó, hệ thống sẽ không biết rằng bạn có thể bỏ qua giá trị nếu tùy chọn được xác định trong nguồn
Mars

50

Một quy tắc quan trọng liên quan đến việc sử dụng tham số mặc định: Các
tham số mặc định phải được chỉ định ở phần cuối bên phải, khi bạn chỉ định một tham số giá trị mặc định, bạn không thể chỉ định lại tham số không mặc định. Ví dụ:

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

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

@Chubsdad - Ahh..báo cáo tham vọng tồi tệ của tôi! câu lệnh thứ hai có tính đúng không? "một khi bạn chỉ định một tham số giá trị mặc định, bạn không thể chỉ định lại parmeter không mặc định nữa"
Alok Save

1
Vì vậy, nếu tôi hiểu chính xác nếu tôi có nhiều tham số tùy chọn, tôi nên triển khai tất cả chúng hoặc không có gì cả? Tôi không thể chọn sử dụng 1 tham số tùy chọn nhưng không sử dụng phần còn lại?
Gerard

@Gerard: Ví dụ "Được phép" hiển thị một tham số tùy chọn chứ không phải trường hợp sử dụng còn lại hợp lệ.
Alok Save

4
Tôi hiểu, nhưng điều gì sẽ xảy ra nếu tôi phải có int foo(int x, int y = 10, int z = 10)và muốn gọi foo(1,2), vì vậy chỉ đưa ra một tham số tùy chọn. Tôi dường như không thể tự mình làm cho nó hoạt động được.
Gerard

30

Có thể thú vị với một số bạn rằng trong trường hợp có nhiều tham số mặc định:

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

Cho các lệnh gọi hàm sau:

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

Sản lượng sau được tạo ra:

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

Tham khảo: http://www.learncpp.com/cpp-tutorial/77-default-parameters/


1
Đây là những gì tôi đang tìm kiếm. Sử dụng một hàm có thể xử lý số lượng đối số khác nhau. Khai báo hàm với giá trị mặc định trong tệp tiêu đề sau đó xác định nó mà không có Tham số mặc định và sau đó bạn có thể sử dụng nó. Không cần phải làm chức năng quá tải
Teh Sunn Liu

15

Sử dụng các thông số mặc định

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

}

Lưu ý: Những điều sau đây là sai

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

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

Cảm ơn vì giải pháp chung, tôi đang cố gắng tìm ra cách cung cấp giá trị mặc định cho bất kỳ kiểu tùy ý nào.
Ẩn danh

13

Để làm theo ví dụ được đưa ra ở đây, nhưng để làm rõ cú pháp với việc sử dụng tệp tiêu đề, khai báo hàm chuyển tiếp chứa giá trị mặc định tham số tùy chọn.

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

Với dấu phẩy phân tách chúng, giống như các tham số không có giá trị mặc định.

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

Thông thường bằng cách đặt giá trị mặc định cho một tham số:

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

Với việc giới thiệu std :: option trong C ++ 17, bạn có thể chuyển các đối số tùy chọn:

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

Đầu ra:

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.