May 1, 2012

Struct, Enum, union.

 

Thực tế enum và struct, union không có sự liên quan mật thiết cho lắm.

enum dùng để khai báo danh sách  các hằng nguyên.

Giả sử ta muốn thiết lập cá giá trị màu, ví dụ: RED = 0; BLACK = 1; WHITE = 2; BLUE =4;

Thông thường ta dùng #define:

#define RED 0
#define BLACK 1
#define WHITE 2
#define BLUE 3
Tuy nhiên, ta có thể rút gọn bằng cách viết sau:



enum color {RED,BLACK,WHITE,BLUE};

Một số điều lưu ý:



  • Giá trị đầu tiên, nếu không khởi tạo giá trị thì mặc định là bằng 0.

  • Nếu không thiết lập giá trị thì hằng đó được tính bằng giá trị đứng trước cộng 1, đến khi nào gặp được hằng có giá trị khởi tạo hoặc giá trị đầu tiên.

Ví dụ:



enum Color{
RED; // = 0
BLACK; // = 1
WHITE; // =2
BLUE; // 3
GREEN = 100; 
YELLOW; // = 101
CYAN; // = 102
};
 

Khai báo và sử dụng:


enum Color cl;


Chỉ sử dụng các hằng đã khai báo trong enum để tính toán và sử dụng.Nếu tính toán với các số nguyên khác thì nên ép kiểu.


Ví dụ chung:


 



#include <iostream>
using namespace std;
enum Shape{
    circle = 0, // first element = 0 default;
    triangle =5,
    ellipse ,
};
int main() {
    enum Shape s1;
    s1 = circle;
    cout << "Circle " << dec << s1 << endl;
    s1 = triangle;
    cout << "Triangle = " << dec << s1 << endl;
    s1 = ellipse;
    //s1 = 0; // error
    s1 = (enum Shape) (triangle + 100);
    cout << "Ellipse = " << dec << s1 << endl;
    cout << "Size of shape:" << sizeof(Shape) << endl;
    return 0;
}

Union và Struct:


Đều mang ý nghĩa là khai báo và thiết lập dữ liệu có cấu trúc. (struct cũng giống class trong C++ để khai báo đối tượng, điểm khác nhau là class mặc định access control là private, còn struct là public). 


Về chức năng của struct và union hoàn toàn giống nhau, chỉ khác một điều union tận dụng tối đa vùng nhớ trống để lưu trữ kiểu dữ liệu. Còn struct thì không. 


Code sau đây mô tả phần nào sự khác biệt của struct và union:



#include <iostream>
using namespace std;
typedef union Struct1{
    char a;
    char b;
    int c;
};
// *************************
typedef struct Struct2{
    char a;
    char b;
    int c;
};
typedef Struct1 STRUCT1;
typedef Struct2 STRUCT2;
int main() {
    STRUCT1 a1;
    STRUCT2 a2;
    cout <<"Size of struct 1" << sizeof(a1) << endl;
    cout << "Size of struct 2" << sizeof(a2) << endl;
    a2.a = 10;
    a2.b = 20;
    int t = a1.a + a1.b;
    int tt = *(&a2.a) + *(&a2.b); 
    cout << "SUM = " << tt << endl;
    return 0;
}

Thông qua đoạn code, ta thấy:



  • Truy cập thành phần bằng dấu ".".

  • Tính toán và sử dụng như các biến bình thường, truy xuất địa chỉ cũng tương tự.

Kiểu dữ liệu có cấu trúc rất mạnh và cần một bài khác để viết. Tạm thời bài này chỉ giới thiệu sơ khởi và cơ bản về các khái niệm này.