Enum là gì

     
Chào các bạn đang theo dõi khóa học lập trình trực tuyến ngữ điệu C++.

Bạn đang xem: Enum là gì

Trong bài học ngày hôm nay, bọn họ sẽ cùng khám phá về trường đoản cú khóa enum, cách sử dụng, và quan trọng nhất là trên sao chúng ta sử dụng enum trong ngôn từ C++.

Enumarated types

Kiểu liệt kê là 1 trong trong số những kiểu tài liệu do người lập trình từ định nghĩa. Tại sao chúng ta cần có mang kiểu tài liệu mới? Trong quá trình lập trình, hồ hết kiểu dữ liệu được có mang sẵn trong ngữ điệu lập trình có thể không có lại ý nghĩa sâu sắc phù hợp. Ví dụ mình muốn sử dụng các giá trị từ là một đến 7 để đại diện cho 7 ngày vào tuần (1 đại diện thay mặt cho ngày công ty nhật, 7 đại diện thay mặt cho sản phẩm công nghệ 7), vì vậy mình cần tối thiểu là 7 biến đổi để lưu trữ những giá trị này:

const int SUNDAY = 1;const int MONDAY = 2;const int TUESDAY = 3;const int WEDNESDAY = 4;const int THURSDAY = 5;const int FRIDAY = 6;const int SATURDAY = 7;Mình không thực hiện mảng một chiều trong trường phù hợp này vì:

int DAYS_OF_WEEK<7> = 1, 2, 3, 4, 5, 6, 7 ;Những nhỏ số cụ thể không có lại chân thành và ý nghĩa cho tín đồ đọc mã mối cung cấp chương trình. Việc sử dụng tên của những biến hằng số sẽ giúp đỡ chương trình họ rõ ràng hơn.

Nhưng câu hỏi khai báo những hằng số như trên vẫn có một vài nhược điểm:

Có thể khai báo thiếu sót một vài quý giá khi danh sách các hằng số là thừa nhiều.

Có thể khai báo không theo một quy hiện tượng (hay lắp thêm tự) nhất định khiến chúng ta khó tra cứu trong chương trình. Ví dụ:

const int WEDNESDAY = 4;const int SUNDAY = 1;const int TUESDAY = 3;const int FRIDAY = 6;const int MONDAY = 2;const int SATURDAY = 7;const int THURSDAY = 5;Có một vài hằng số không liên quan đến nhau nhưng được khai báo ngay sát nhau khiến bọn họ dễ rối. Ví dụ:

const float PI = 3.14;const float ACCELERATION_OF_GRAVITY = 9.8;const int MAX_SIZE_OF_ARRAY = 255;//..............Như vậy, ao ước khắc phục một trong những nhược điểm trên, bọn họ cần tìm phương pháp để tập hợp những hằng số có chân thành và ý nghĩa tương đương nhau thành hầu hết nhóm hằng số riêng biệt. Kiểu dáng liệt kê vẫn giúp bọn họ thực hiện tại điều này.

Công dụng của đẳng cấp liệt kê

Như bản thân đã trình diễn ở trên, đẳng cấp liệt kê có tính năng giúp thay thế các con số (giá trị gắng thể) bằng các cái tên có ý nghĩa, và nó còn giúp họ tập hợp những giá trị có ý nghĩa sâu sắc liên quan lại với nhau thành từng nhóm. Mỗi team hằng số này khi đưa vào giao diện liệt kê sẽ biến đổi một kiểu dữ liệu (người ta thường điện thoại tư vấn enumeration là 1 kiểu tài liệu trong C++ vì nó gồm cách khai báo tương tự như khai báo biến, chứ bản thân thấy nó như là một group của những giá trị hơn).

Cú pháp khai báo kiểu dáng liệt kê

Để tư tưởng một thứ hạng liệt kê mới, bọn họ sử dụng từ bỏ khóa enum theo kết cấu sau:

enum //list all of values inside this block//each enumerator is separated by a comma, not a semicolon;Việc khai báo kiểu dữ liệu mới (như dạng hình enum) không yêu ước chương trình cấp phát bộ nhớ, thời điểm nào bọn họ sử dụng loại enum vừa đã được định nghĩa để tạo nên biến kiểu enum thì lịch trình mới cấp phát bộ nhớ.

Mỗi giá trị trong block của kiểu enum bí quyết nhau bởi một dấu phẩy (đối với mức giá trị cuối cùng thì ko cần sử dụng dấu phẩy).

Khai báo dạng hình liệt kê

Mình đang nói về kim chỉ nan của hình trạng enum (kiểu liệt kê) xong, chắc bây giờ các bạn cũng đang tò mò và hiếu kỳ muốn biết cuối cùng thì khai báo và áp dụng nó như vậy nào. Dưới đó là một ví dụ:

enum DaysOfWeekSUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;Như chúng ta thấy, sau khoản thời gian định nghĩa một đẳng cấp enum ngừng thì xong xuôi nó là 1 trong dấu chấm phẩy, bởi đây cũng là một trong câu lệnh. Về khía cạnh cơ bản, bọn họ phải đặt toàn bộ câu lệnh trên cùng một dòng:

enum DaysOfWeek SUNDAY,MONDAY,TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY ;Nhưng compiler vẫn hiểu được một câu lệnh ở trên các dòng đề nghị mình chọn lựa cách viết làm việc trên (tách thành nhiều dòng) để phần quan niệm của mình ví dụ hơn.

Như vậy là bọn họ đã bao gồm một kiểu tài liệu mới cho chương trình. Các chúng ta có thể gọi DaysOfWeek là một kiểu dữ liệu (kiểu enum hay phong cách liệt kê) hoặc có thể gọi là tên của một đội nhóm các cực hiếm cũng như họ hay đi chơi với bằng hữu theo nhóm nhỏ tuổi rồi đặt tên cho nhóm vậy.

Trong một chương trình, chúng ta cũng có thể có nhiều khai báo kiểu dáng enum khác nhau. Ví dụ mình khai báo thêm vài giao diện enum khác:

enum DaysOfWeekSUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;enum ColorRED,GREEN,BLUE,WHITE;enum AnimalCAT,DOG,HORSE,MONKEY,CHICKEN;Như vậy là lịch trình của họ có 3 kiểu tài liệu mới (3 nhóm quý hiếm mới), mỗi dạng hình enum này trọn vẹn không liên quan gì đến nhau, chỉ có những giá trị bên phía trong mỗi dạng hình enum bắt đầu có tương quan đến nhau về mặt ý nghĩa.

Xem thêm: Tổng Hợp Những Cuốn Sách Kinh Doanh Hay Nhất Mọi Thời Đại (Phần 1)

Nhưng gồm thấy giá trị nào đâu?

Khi chú ý vào bên trong khối lệnh quan niệm của hình dạng enum mang tên Color, họ chỉ thấy đông đảo những danh trường đoản cú như RED, GREEN, BLUE... Mà không có thấy gì những nhỏ số. Thực chất, rất nhiều danh từ này đã có gắn cho một giá trị thế thể, và các chiếc danh tự mà họ nhìn thấy sẽ thay mặt cho đông đảo giá trị đó. Sử dụng những danh từ bỏ để thay thế cho những con số để giúp đỡ người gọi chương trình dễ hiểu hơn (chứ không giúp chương trình chạy cấp tốc hơn).

Enumerator values

Bây giờ bản thân sẽ có tác dụng một chương trình mẫu để show cho các bạn xem gần như giá trị được để trong block của một hình dạng enum bản thân tự định nghĩa:

int main()enum AlphabetLETTER_A,LETTER_B,LETTER_C,LETTER_D,LETTER_E;cout << LETTER_A << endl;cout << LETTER_B << endl;cout << LETTER_C << endl;cout << LETTER_D << endl;cout << LETTER_E << endl;return 0;Khi bản thân chạy chương trình, công dụng xuất hiện nay trên console là:

*

Như vậy, ko cần chúng ta trực tiếp gán giá bán trị cho những tên hằng số, compiler đã tự động khởi tạo giá trị mang đến chúng, bắt đầu với cực hiếm 0 và tăng dần. Các bạn cũng đang thấy rằng, sau thời điểm định nghĩa xong xuôi 1 thứ hạng enum thì bạn cũng có thể sử dụng các tên gọi phía bên trong enum giống như các hằng số. Bởi vì những quý hiếm hằng số này là cực hiếm kiểu integer (int), nên chúng ta cũng có thể gán chúng mang đến những biến đổi kiểu int khác. Ví dụ:

enum AlphabetLETTER_A,LETTER_B,LETTER_C,LETTER_D,LETTER_E;int iValue = LETTER_A;Bên cạnh việc auto gán giá bán trị đến từng thành phần được liệt kê, bọn họ cũng có thể chủ động thay đổi giá trị cho việc đó (nhưng chỉ gồm thể đổi khác giá trị trong phần khai báo), một enum sau thời điểm đã định nghĩa chấm dứt thì ko thể chuyển đổi những cực hiếm của danh sách các phần tử nữa.

enum DirectionUP = 1, //assigned 1 by programmerDOWN = 3, //assigned 3 by programmerLEFT, //assigned 4 by compilerRIGHT //assigned 5 by compiler;cout << UP << " " << DOWN << " " << LEFT << " " << RIGHT << endl;Đoạn công tác này sẽ in ra:

1 3 4 5Như vậy, compiler sẽ auto gán giá trị đến các thành phần không được khởi sản xuất giá trị. Nước ngoài trừ bộ phận đầu tiên vào enum, đông đảo hằng số khác sẽ tiến hành gán quý giá bằng bộ phận trước nó cộng thêm 1.

Lưu ý: các hằng số trong và một enum hoàn toàn có thể có cùng quý giá với nhau.

Best practice: Don’t assign specific values khổng lồ your enumerators.

Rule: Don’t assign the same value to lớn two enumerators in the same enumeration unless there’s a very good reason.

Sử dụng phong cách enum đã định nghĩa như một kiểu tài liệu thông thường

Như mình trình diễn ở trên, từ bỏ khóa enum vào C++ giúp bọn họ định nghĩa một kiểu tài liệu mới cho chương trình. Tuy nó chỉ cần tập đúng theo danh sách các hằng số có chân thành và ý nghĩa tương quan tiền với nhau, nhưng thực chất nó vẫn là 1 trong những kiểu dữ liệu (kiểu liệt kê) nên bạn có thể sử dụng chúng để tạo ra các biến. Ví dụ:

enum Color COLOR_BLACK, COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_CYAN, COLOR_YELLOW;Color backgroundColor;Bây giờ, họ đã có một vươn lên là kiểu Color. đổi mới backgroundColor chỉ có tính năng lưu trữ giá trị của 1 trong các số tất cả các hằng số đã có được liệt kê bên phía trong kiểu Color. Việc tiến hành gán các giá trị khác loại Color sẽ tạo ra lỗi về mặt cú pháp.

Color backgroundColor = 5; //errorBây giờ bản thân sẽ lựa chọn ra bất kỳ một hằng số ở trong kiểu màu sắc để gán cho phát triển thành backgroundColor.

Color backgroundColor = COLOR_GREEN;Các bạn cần lưu ý rằng, biến hóa kiểu enum chỉ rất có thể được gán giá trị là một trong số những hằng đã khai báo bên trong kiểu tài liệu của chủ yếu nó, không thể áp dụng hằng của hình dáng enum khác. Ví dụ:

enum TestTEST1,TEST2,TEST3;enum Color COLOR_BLACK, COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_CYAN, COLOR_YELLOW;Color backgroundColor = TEST1; //this line makes an errorCompiler sẽ thông báo lỗi: "a value of type chạy thử cannot be used to initialize an entity of type Color".

Những lấy một ví dụ về việc thực hiện enum

Sau khi sẽ gán quý hiếm cho biến hóa kiểu enum, thay đổi này sẽ với giá trị là một số trong những nguyên, và chúng ta có thể sử dụng đổi thay này nhằm in ra, tính toán, so sánh, truyền vào hàm theo phong cách giá trị, ... Và còn nhiều mục tiêu khác.

Xem thêm: Bài Thơ Em Cũng Là Cô Giáo Án Thơ: “Em Cũng Là Cô Giáo”, Thơ Em Cũng Là Cô Giáo

Trên thực tế, chúng ta thường thực hiện kiểu enum để lấy ra sàng lọc hàm hoặc thủ tục để thực thi. Ví dụ:

Thông thường, sau mỗi nhãn case bọn họ sẽ để một cực hiếm số nguyên ứng với từng trường hợp, cơ mà bây giờ chúng ta cũng có thể thay cố gắng những số lượng bằng những định danh của enum. Trước đó khi thao tác làm việc với câu lệnh switch-case, bạn có thể bỏ sót một trong những trường hợp đề xuất xem xét nếu con số các trường phù hợp là vượt nhiều. Tuy vậy khi sử dụng Visual studio 2015 và vẻ bên ngoài enum, chúng ta sẽ tránh được sự thiếu sót này. Dưới đây là cách nhưng mà Visual studio năm ngoái hổ trợ mang lại kiểu enum:

Trong hàm showProducts, mình gõ câu lệnh switch tuy vậy sử dụng gợi nhắc của Visual studio.