C++ 2 loại enum
- enum truyền thống (C-style)
- enum class (scoped enum) : định nghĩa bên trong một namespace hoặc class, dùng toán tử phạm vi :: để truy cập.
#include <iostream>
using namespace std;
// Định nghĩa enum thường
enum Status
{
PENDING // mặc định = 0
, APPROVED // mặc định = 1
, REJECTED // mặc định = 2
};
// Hàm nhận tham số kiểu enum
void handleStatus(Status s) {
switch (s) {
case PENDING: cout << "Đang chờ xử lý"; break;
case APPROVED: cout << "Đã duyệt"; break;
case REJECTED: cout << "Bị từ chối"; break;
}
cout << endl;
}
int main() {
Status stt = APPROVED;
handleStatus(stt); // gọi hàm với biến enum
handleStatus(REJECTED); // gọi hàm trực tiếp với hằng enum
return 0;
}#include <iostream>
using namespace std;
// Định nghĩa enum class
enum class Status
{
PENDING
, APPROVED
, REJECTED
};
void handleStatus(Status s) {
switch (s) {
case Status::PENDING: cout << "Đang chờ xử lý"; break;
case Status::APPROVED: cout << "Đã duyệt"; break;
case Status::REJECTED: cout << "Bị từ chối"; break;
}
cout << endl;
}
int main() {
Status stt = Status::APPROVED;
handleStatus(stt); // gọi hàm với biến enum
handleStatus(Status::APPROVED); // gọi hàm trực tiếp với hằng enum
return 0;
}Ưu điểm khi dùng enum class
- Tránh xung đột tên (không cần lo trùng với hằng số khác).
- Bắt buộc dùng cú pháp phạm vi :: giúp code rõ ràng và dễ đọc.
- An toàn hơn vì không tự động chuyển đổi sang int như enum thường.
enum Color { Red, Green, Blue }; // enum thường
enum class Fruit { Apple, Orange }; // enum class
Color c = Red;
int x = c; // Hợp lệ (ngầm định chuyển đổi)
Fruit f = Fruit::Apple;
// int y = f; // Lỗi: không thể chuyển đổi ngầm định
- Với enum thường, giá trị Ok có thể so sánh trực tiếp với số nguyên 0. Điều này dễ gây bug nếu vô tình so sánh sai.
- Với enum class, compiler bắt buộc bạn phải so sánh cùng loại (Permission::Read với Permission::Read), không thể so sánh với số nguyên. Điều này làm cho enum class an toàn hơn và code rõ ràng hơn.
#include <iostream>
enum Status { Ok, Error }; // enum thường
enum class Permission { Read, Write }; // enum class
int main() {
Status s = Ok;
if (s == 0) { // Hợp lệ vì Ok tự động chuyển thành int
std::cout << "Status OK\n";
}
Permission p = Permission::Read;
// if (p == 0) { } // Lỗi biên dịch: không thể so sánh trực tiếp với int
if (p == Permission::Read) { // Hợp lệ
std::cout << "Permission Read\n";
}
return 0;
}