typedef và enum trong C++

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

Leave a Comment