Trang chủ » Bài 15 – Kiểu dữ liệu cấu trúc (struct)
Lập trình C/C++

Bài 15 – Kiểu dữ liệu cấu trúc (struct)

cplusplus

Xin chào mọi người!

Giả sử trong một trường có rất nhiều sinh viên. Nhà trường muốn quản lý sinh viên nên lập ra phần mềm quản lý. Vấn đề xảy ra là 1 sinh viên có rất nhiều kiểu dữ liệu cơ bản khác nhau: họ tên, lớp, MSSV, giới tính, điểm,… Có những bạn sẽ sử dụng nhiều mảng cho vấn đề này, nhưng đó không phải là cách tối ưu (có khoảng 15 thông tin về sinh viên mà phải tạo ra 15 mảng thì chắc bác sĩ cũng…bó tay). Tuy nhiên, kiểu dữ liệu cấu trúc (struct) sẽ giải quyết vấn đề này.

1. Khái niệm

Cú pháp

struct <tên struct>{
<các thành phần của kiểu,...>
};
// Ngoài ra, ta có thể khai báo như sau
struct <tên struct>{
<các thành phần của kiểu,...>
}<danh sách biến kiểu struct>;

Các kiểu dữ liệu được định nghĩa sẵn ở đây là những kiểu dữ liệu ta đã được học, những struct đã được khai báo ở trên,… Điều khác biệt trong C++ so với C, đó chính là việc không cần khai báo từ khoá struct khi khai báo biến (với từ khoá typedef).

Có lẽ một số bạn khi học xong Hướng đối tượng sẽ cảm thấy có 1 chút gì đó giống nhau giữa struct và class. Thực tế đúng là như vậy. Điểm khác biệt duy nhất giữa struct và class chính là access modifier mặc định của từng kiểu khi không khai báo (các bạn có thể xem thêm ở bài Kế thừa trong OOP – Phần 2):

  • Với struct là public
  • Với class là private

Ta cùng tạo ra 1 ví dụ xuyên suốt bài học nhé! Vấn đề lập danh sách học sinh ở trường học đã được giải quyết với struct:

struct Diem
{
double DiemToan;
double DiemLy;
double DiemHoa;
};
struct SinhVien
{
unsigned int MSSV;
string HoTen;
string Lop;
bool GioiTinh;
Diem diem;
};

2. Sử dụng struct

Để truy cập đến từng thành phần trong struct, ta sử dụng toán tử chấm (.):

SinhVien sv1 = { 1412469, "Vo Hoai Son", "14CTT3", false, { 5, 5, 5 } }; // Khai báo sv1 và gán giá trị mặc định
// Hồi đó mình học dốt nên để 3 con 5 cho nó đều :v
cout << "Ten: " << sv1.HoTen << endl;
cout << "Diem toan: " << sv1.diem.DiemToan << endl;

Ngoài ra, nếu ta cấp phát động cho struct thì sẽ có 1 sự khác biệt nho nhỏ, đó là việc sử dụng toán tử (->) thay cho (.) ở con trỏ:

SinhVien *sv1 = new SinhVien;
sv1->HoTen = "Vo Hoai Son"; // Ta sử dụng -> bình thường
sv1->diem.DiemToan = 5; // Nhưng diem không phải là con trỏ, vì vậy ta vẫn sử dụng toán tử (.)
// Ngoài ra ta cũng có thể sử dụng
(*sv1).diem.DiemToan = 5; // Đến đây, *sv1 là giá trị mà con trỏ sv1 trỏ đến, nên vẫn sử dụng toán tử (.) như bình thường

Ở bài sau, mình sẽ nói về struct và danh sách liên kết (Linked List) trong C++. Cảm ơn mọi người đã theo dõi! Hẹn gặp lại ở những bài tiếp theo~

Tags

About the author

Võ Hoài Sơn

Tính tình bất định
Chọc vào là bịnh
Rất yêu lập trình
Luôn code hết mình
Mình hiện đang là sinh viên của trường ĐH Khoa học tự nhiên TPHCM. Bản thân rất thích code, kiêm luôn cả mần thơ nên thường hơi hâm hâm dở dở. Ngoài ra chém gió, chém chuối, chém trái cây các kiểu cũng là sở trường của mình. Rất mong được làm quen với các bạn :D

Add Comment