Video: THAY TÔI YÊU CÔ ẤY (ĐNSTĐ) | OFFICIAL MV 4K | THANH HƯNG 2025
Lập trình là tất cả về tính dễ đọc. Thật khó để viết và duy trì một chương trình mà bạn không thể đọc được (thực sự là không thể). Một phần của việc đọc một danh sách mã nguồn là hiểu những gì các con số được sử dụng trong chương trình đại diện. Sự trợ giúp cơ bản nhất mà C ++ cung cấp là phổ biến ở #define, như trong ví dụ sau đây:
#define PI 3. 141592653589793
Giải pháp này không quan trọng đối với các giá trị cá nhân, mặc dù nó # xác định cơ chế không phải là (nói đúng) một phần của C / C ++ vì bộ tiền xử lý chạy trước trình biên dịch. Để đáp lại điều đó, C ++ 2011 giới thiệu một biểu thức biểu thức hằng
constexpr long double PI = 3. 141592653589793;
Từ khoá constexpr đưa các hằng số vào lều C ++. PI này có một kiểu thực, giống như các biến C ++ khác. C ++ có thể tạo ra các thông báo lỗi với PI có ý nghĩa hơn nhiều so với các liên quan đến 3. 14159.
Các biểu thức liên tục là tốt đối với các giá trị hằng số riêng lẻ, nhưng các hằng số thường đại diện các tập hợp các sự kiện chứ không phải các hằng tự nhiên, như trong ví dụ sau:
#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … và như vậy …
Có lẽ các hằng số này đang được sử dụng để xác định các trạng thái, có lẽ được sử dụng như một chỉ mục vào một mảng các đối tượng trạng thái hoặc như một giá trị trong một cơ sở dữ liệu ở đâu đó.
C + + từ lâu đã có một cơ chế cải tiến để xác định các loại hằng số này - đếm:
enum STATE {DC_OR_TERRITORY, // nhận được 0 ALABAMA, // được 1 ALASKA, // được 2 ARKANSAS, // … và Sớm…};
Từ khóa enum giới thiệu một dãy các hằng được gọi là "liệt kê". Trong trường hợp này, điều tra mang tên STATE. Mỗi phần của liệt kê này được gán giá trị bắt đầu từ 0 và tăng tuần tự bằng 1, do đó DC_OR_TERRITORY được định nghĩa là 0, ALABAMA được định nghĩa là 1, v.v. Bạn có thể ghi đè lên trình tự gia tăng này bằng cách sử dụng lệnh gán như sau:
enum STATE (DC, TERRITORY = 0, ALABAMA, ALASKA, // … và như vậy …};
Phiên bản này của STATE định nghĩa một phần tử DC, được cho giá trị 0. Sau đó định nghĩa một phần tử mới TERRITORY, cũng được gán giá trị 0. ALABAMA chọn với 1, giống như trước.
Trong thực tế, lập trình có thể sử dụng liệt kê để viết mã khá dễ đọc như sau:
double taxRate (STATE s) {return taxRatesByState [s];}
Vấn đề duy nhất với cách tiếp cận này là liệt kê này không tạo ra một loại mới (như bạn nghĩ).Trong thực tế, theo tiêu chuẩn, STATE chỉ là một tên khác cho int - và các hằng số ALABAMA, ALASKA, vân vân là tất cả các kiểu const int.
trình biên dịch gcc thực sự cung cấp một enum tuyên bố theo cách này một chút quyền lực hơn đơn giản gọi nó là một hình thức int. Bạn thực sự có thể quá tải các chức năng dựa trên một loại enum:
void fn (STATE s); void fn (int n); fn (ALASKA); // kích hoạt fn (STATE)
Tiêu chuẩn năm 2011 cho phép lập trình tạo một kiểu hoàn toàn mới bằng cách sử dụng từ khóa enum. Vì người sáng tạo của tiêu chuẩn mới không muốn phá vỡ mã hiện tại, tiêu chuẩn yêu cầu thêm một từ khoá phụ để xác định một kiểu điều tra, như trong ví dụ sau:
enum class STATE (DC, TERRITORY = 0, ALABAMA, ALASKA, // … và như vậy …};
Một lớp điều tra bây giờ là một loại quy mô đầy đủ như bất kỳ lớp người dùng định nghĩa khác. Những điều sau đây thậm chí không hợp pháp nữa vì hai lý do:
int s = ALASKA;
Trước tiên, ALASKA không đổi chỉ được định nghĩa trong không gian tên STATE. Do đó, tên của hằng là STATE:: ALASKA. Thứ hai, loại không phải là int nhưng STATE. Bạn không thể gán một giá trị của kiểu STATE thành một int.
STATE s = STATE:: ALASKA;
Lập trình viên có thể tái tạo một STATE vào một int nhưng cô ấy phải làm như vậy rõ ràng -chuyển đổi rõ ràng không cắt nó với các lớp đếm:
int n = (int) STATE:: ALASKA;
Loại enum mới này cũng có thể dựa trên một trong số các loại số đếm khác ngoài chỉ là int:
enum class STATE: char {DC, // … phần còn lại của khai báo giống