[Basic] Enum trong C++

Trong C++ cho phép người dùng tự tạo kiểu dữ liệu mới, nó được gọi với cái tên khá dễ hiểu là kiểu dữ liệu người dùng định nghĩa.

Có lẽ enum là kiểu dữ liệu người dùng định nghĩa đơn giản nhất.

Định nghĩa

Enum là kiểu dữ liệu mà tất cả các phần tử của nó có giá trị là hằng số.

Enum được định nghĩa thông qua từ khóa enum.

Ví dụ

enum Color
{
   RED,
   
   BLUE,
   
   GREEN,
};

Ví dụ trên ta định nghĩa 1 kiểu dữ liệu enum có tên là Color, trong enum đó chứa 3 phần tử là RED, BLUE và GREEN.

Chú ý:

  • Đừng quên dấu ‘;’ sau dấu ‘}’ khi định nghĩa kiểu dữ liệu enum.
  • Khi ta định nghĩa kiểu dữ liệu enum, nó chưa được câp phát bộ nhớ, bộ nhớ chỉ được cấp phát khi định nghĩa biến có kiểu enum

Ví du:

Color color; //Định nghĩa biến color có kiểu enum Color

Color red = RED; //Định nghĩa biến red có kiểu Color và khởi tạo giá trị là Color.RED

Giá trị của các phần tử trong enum

Nếu ta không gán giá trị cho các phần tử của enum thi mỗi phần tử trong enum được gán tự động 1 giá trị nguyên dựa vào vị trí của phần tử đó.

Phần tử đầu tiên được gán giá trị mặc định là 0, lần lượt các phần tử tiếp theo giá trị tăng thêm 1

Ví dụ:

enum Color
{
   RED, // RED có giá trị 0
   
   BLUE, // BLUE có giá trị 1
   
   GREEN, //GREEN có giá trị 2
};

Khi chúng ta gán giá trị tường minh cho các phần tử trong enum

Ví dụ:

enum Color
{
   RED = -5, // RED có giá trị -5
   
   BLUE, // BLUE có giá trị -4
   
   GREEN, //GREEN có giá trị -3
   
   BLACK = 10, //BLACK có giá trị 10
   
   PINK, //PINK có giá trị 11
};

Kiểu dữ liệu của các phần tử trong enum (C++ 11)

Mặc định các phần tử của enum có kiểu là int

Với C++ 11 ta có thể khai báo kiểu cho các phần tử của enum.

Cú pháp :

enum ten_enum : kiểu_dữ_liệu
{
   //Các phần tử
};

Ví dụ:

enum Color : unsigned char
{
   RED, // RED có giá trị 0
   
   BLUE, // BLUE có giá trị 1
   
   GREEN, //GREEN có giá trị 2
};

Chú ý :

  • Kiểu dữ liệu của các phần tử enum phải là kiểu nguyên.
  • Enum sẽ được ép kiểu ngầm định sang kiểu int, nhưng kiểu int phải ép kiểu tường mình sang enum

Ví dụ:

int val = Color::RED; //OK

Color color = 1; // ERROR

Color blue = static_cast<Color> (1); //OK

Khi nào nên sử dụng Enum?

Enum thường được sử dụng cho các trạng thái cụ thể mà giá trị của nó được xác định trước. Khi đó sẽ làm code của ta dễ đọc, dễ hiểu hơn.

Ta xét ví dụ đọc nội dung của 1 file;

int readFileContents()
{
   if (openFile() == false)
   {
      //Mở file lỗi trả về -1
      return -1;
   }
   if (readFile() == false)
   {
      //Đọc file lỗi trả về -2
      return -2;
   }
   if (parseFile() == false)
   {
      //Parse file lỗi trả về -3
      return -3;
   }
   //Success trả về 0
   return 0;
}

Nhìn code khá khó đọc với những con số -1, -2, -3. Đến 1 ngày đẹp trời nào đó chúng ta thay đổi mã lỗi trả về, như openFile false thì trả về -5 chẳng hạn, lúc đó ta phải tìm tất cả các chỗ gọi hàm readFileContents để sửa, khá mất công.

Lúc này ta chuyển sang sử dụng enum.

enum ReadFileResult
{
   SUCCESS = 0,
   
   OPEN_ERROR = -1,
   
   READ_ERROR = -2,
   
   PARSE_ERROR = - 3,
};

int readFileContents()
{
   if (openFile() == false)
   {
      return OPEN_ERROR;
   }
   if (readFile() == false)
   {
      return READ_ERROR;
   }
   if (parseFile() == false)
   {
      return PARSE_ERROR;
   }
   return SUCCESS;
}

Nhìn code trực quan và đẹp hơn, dễ hiểu hơn. Khi thay đổi mã lỗi ta chỉ cần sửa giá trị trong enum, dễ dàng hơn rất nhiều.

Was this article helpful?

Có 1 bình luận

  1. Nói theo ngôn ngữ nông dân 1 tí thì enum được dùng khi miền giá trị của biến là nhỏ (như các ngày trong tuần, các tháng trong năm, giới tính, màu da, màu tóc, các ngón tay trên bàn tay…) mà ta chỉ quan tâm đến tên của nó chứ ứ cần biết giá trị của nó là gì.
    Ngoài enum ra ta có thể dùng enum class (thêm từ khoá class sau từ khoá enum) khi ta hoàn toàn không quan tâm đến giá trị của nó, lúc ấy compiler sẽ ngăn ta gán 1 giá trị int hay long nào đấy cho biến enum, coi như “tao chỉ gán enum cho enum thôi”… :v

Leave A Comment?