Bỏ qua để đến nội dung

Tham số mặc định (Default Arguments)

C++ cho phép gán giá trị mặc định cho tham số - nếu người gọi không truyền đối số đó, giá trị mặc định sẽ được dùng.

#include <iostream>
void greet(std::string name, std::string greeting = "Xin chao") {
std::cout << greeting << ", " << name << "!" << std::endl;
}
int main() {
greet("Alice"); // Xin chao, Alice!
greet("Bob", "Chao buoi sang"); // Chao buoi sang, Bob!
return 0;
}

Quy tắc quan trọng: tham số mặc định phải nằm ở cuối

Phần tiêu đề “Quy tắc quan trọng: tham số mặc định phải nằm ở cuối”

C++ bắt buộc tham số có giá trị mặc định phải nằm sau các tham số không có giá trị mặc định:

// Hợp lệ
void greet(std::string name, std::string greeting = "Xin chao") { }
// KHÔNG hợp lệ - lỗi biên dịch
// void greet(std::string greeting = "Xin chao", std::string name) { }
void create_user(std::string name, int age = 18, std::string country = "Vietnam") {
std::cout << name << ", " << age << ", " << country << std::endl;
}
int main() {
create_user("Alice"); // Alice, 18, Vietnam
create_user("Bob", 25); // Bob, 25, Vietnam
create_user("Charlie", 30, "USA"); // Charlie, 30, USA
return 0;
}

⚠️ Đối số luôn được truyền theo đúng thứ tự khai báo - bạn không thể bỏ qua một tham số ở giữa mà chỉ truyền tham số sau nó.

Khai báo giá trị mặc định trong prototype, không lặp lại ở định nghĩa

Phần tiêu đề “Khai báo giá trị mặc định trong prototype, không lặp lại ở định nghĩa”

Nếu hàm có khai báo (prototype) riêng, giá trị mặc định chỉ nên đặt một lần ở khai báo:

void greet(std::string name, std::string greeting = "Xin chao"); // Khai báo
int main() {
greet("Alice");
return 0;
}
void greet(std::string name, std::string greeting) { // KHÔNG lặp lại "= Xin chao" ở đây
std::cout << greeting << ", " << name << "!" << std::endl;
}
  • Cú pháp: kiểu tên_tham_số = giá_trị_mặc_định
  • Tham số có giá trị mặc định phải nằm ở cuối danh sách tham số
  • Đối số luôn phải truyền theo đúng thứ tự khai báo, không thể bỏ qua một tham số ở giữa