C++ Nâng Cao. Sử dụng Define – Constant – Enum
Hi. Chào các bạn.
Trong bài này, chúng ta sẽ tìm hiểu về cách sử dụng #define, biến const và biến enum.
1. Biến Enum.
Là một dạng biến kiểu liệt kê giá trị. Nó có thể được coi là một kiểu dữ liệu đặc biệt do người dùng định nghĩa ra.
Và kiểu dữ liệu enum này nó như là kiểu dữ liệu đại diện cho một nhóm dữ liệu thành viên.
Ví dụ các bạn có một nhóm chơi với nhau vì một đặc điểm chung nào đó.
Ví dụ nhóm chơi cầu lông, thì các thành viên đều biết chơi cầu lông, nhóm chơi nhạc thì các thành viên đều biết chơi nhạc.
Và nhóm sẽ lấy một tên thể hiện ý nghĩa của nhóm.
Thì Enum cũng tương tự như vậy. Kiểu dữ liệu mà enum thể hiện đó là số nguyên.
Cú pháp khai báo Enum như sau:
enum [tên nhóm ]
{
danh sách các thành viên đặt theo một tên ý nghĩa nào đó.
}
Ví dụ: Tôi muốn định nghĩa ra 3 trạng thái của một chương trình chạy media như sau: PLAY – STOP – PAUSE.
enum StateMedia { PLAY = 0, STOP = 1, PAUSE = 2 }
+ Các thành viên được đặt theo một tên ý nghĩa là được gán một giá trị mong muốn.
+ Nếu bạn không gán thì mặc định phần từ ban đầu là 0, phần tử tiếp theo bằng phần tử trước cộng thêm 1
+ Nếu giả sử bạn gán PLAY = 100, sau đó các phần tử sau bạn ko gán, thì nó mặc đinh là 101, 102…
+ Các phần tử cách nhau bởi dấu phẩy riêng phần tử cuối thì ko cần.
+ Bạn có thể gán chúng bằng các giá trị không nhất thiết phải liên tiếp.
Enum được sử dụng cực kỳ phổ biến trong các dự án phần mềm lớn và nhỏ. Nó được ứng dụng cho việc thiết lập các kiểu, trạng thái, thể loại… cho các chức năng, hay loại đối tượng trong một dự án phần mềm.
Ví dụ vẽ các dạng hình học bao gồm : Hình tròn, hình vuông, hình tam giác.
Người ta sẽ sử dụng các giá trị số như 0 đại diện cho hình tròn, 1 đại diện cho hình vuông, 2 đại điện cho hình tam giác.
Nhưng khi so sánh loại hình học. Chúng ta so sánh với 0 , 1 ,2 thì người lập trình viên sẽ rất khó nhớ và hình dung đó đang là loại hình nào.
enum giải quyết vấn đề này rất tường minh.
enum StateMedia { CIRCLE = 0, RECTANGLE = 1, TRIANGLE = 2 }
Khi so sánh tôi chỉ việc thực hiện như sau.
switch (type) { case StateMedia::CIRCLE: break; case StateMedia::RECTANGLE: break; case StateMedia::TRIANGLE: break; default: break; }
Như vậy code rất dễ hiểu. Và việc review code cũng dễ dàng cho người bảo trì phần mềm, hay fixed bug.
Một lưu ý khi dùng enum.
Trong một dự án lớn, khi có nhiều trường hợp phải sử dung enum, thì hãy phân vùng giá trị cho enum.
Không để mặc định giá tri lúc nào cũng là 0, 1, 2…
Như vậy sẽ xảy ra việc trùng lặp giá trị so sánh mà kiểu thì khác nhau.
Ví dụ: Trạng thái Media tôi có thể set PLAY = 100.
Kiểu hình học tôi sẽ sét vùng giá trị là : CIRCLE = 200.
2. Sử Dụng Biến Constant.
Biến constant là một hằng biến. Nó mang một giá trị cố định và không thể thay đổi được.
Biến constant thường sử dụng để lưu những giá trị mang tính cố định, tự nhiên, hay là các hằng số toán học tự nhiên.
Ví dụ: Số PI là một giá trị hằng số trong toán hoặc tự nhiên. Thay vì mỗi phép tính liên quan đến PI người ta phải dùng con số 3.1415
Thì người lập trình viên sẽ định nghĩa một hằng số PI để sử dụng.
Như vậy khi muốn thay đổi giá trị, chỉ cần thay đổi giá trị của biến hằng số thì mọi nơi gọi đến nó đều được cập nhật.
Ví dụ:
const float kPI = 3.1415; const int kConvert = 1000;
+ Chúng ta có thể sử dụng constant cho mục đích như enum, nhưng thường người ta sử dụng enum nhiều hơn.
Constant chỉ sử dụng cho mục đích lưu trữ các giá trị hằng số để thực hiện cho việc tính toán.
2. Sử Dụng #define
#define được gọi là các chỉ thị tiền xử lý. Nó cho phép định nghĩa ra các MACRO đại diện cho một khối lệnh hay một giá trị.
2.1 Sử dụng #define để định nghĩa 1 macro lưu trữ một giá trị.
Cách này thường được sử dụng với vai trò giống constant ở trên, thậm chí nó còn được dùng nhiều hơn constant.
Ví dụ. #define PI 3.1415
PI là một macro mang một giá trị là 3.1415 và được sử dụng trong các biểu thức tính toán.
2.2 Sử dụng #define như một macro đại diện cho một câu lệnh hoặc một khối lệnh.
Ví dụ: #define FindMax(A,B) ((A > B) ? A : B)
+ FindMax(A,B) là một macro và lưu ý là ko có dấu space trong macro
Khi gọi macro chúng ta gọi: FindMax(5,6) thì kết quả trả về là 6.
+ Hết sức lưu ý khi định nghĩa macro vì nó có thể cho ra kết quả không đúng với chung ta mong muốn, mặc dù nó là kết quả đúng.
Ví dụ : #define SQR(a) (a*a) .
Chúng ta nghĩa rằng đây là một macro tính toán bình phương một số. Nhưng rất tiếc là ko chính xác.
Nếu chúng ta gọi> SQR(5) thì kết quả cho chính xác là 25
Nhưng nếu ta gọi SQR(5+3) thì kết quả sẽ là 5+3*5+3 = 23.
Nên phải hết sức lưu ý khi sử dụng macro.
2.3 Sử dụng chỉ thị tiền xử lý để phân biệt các khối xử lý.
Xem lại bài c++ căn bản. => Chỉ thị tiền xử lý.
Ok. Đó cách sử dụng các biến constant, enum, và define.
Pass Pham