
Chào các bạn Gen Z, hôm nay thầy Creyt sẽ giải mã một khái niệm tuy cũ mà cực kỳ "ngon" trong C++: struct. Tưởng tượng thế này, cuộc sống của chúng ta tràn ngập thông tin, và đôi khi nó cứ rời rạc, mỗi thứ một nơi. Như khi bạn muốn lưu thông tin về một người bạn: tên, tuổi, địa chỉ, số điện thoại, email... Nếu mỗi thứ là một biến riêng lẻ, thì loạn lắm, đúng không?
Struct chính là "chiếc hộp thần kỳ" hay "hồ sơ cá nhân" giúp bạn gom tất cả những thông tin liên quan đó vào một chỗ, thành một "thực thể" duy nhất. Nó giống như việc bạn tạo một profile trên mạng xã hội vậy, mọi thông tin cá nhân được sắp xếp gọn gàng trong một trang.
struct là gì và để làm gì?
struct (viết tắt của 'structure' - cấu trúc) trong C++ là một kiểu dữ liệu do người dùng định nghĩa, cho phép bạn nhóm các biến có kiểu dữ liệu khác nhau (như int, string, double, thậm chí cả struct khác) thành một đơn vị logic duy nhất. Mục đích chính? Để tăng tính tổ chức, dễ quản lý và dễ truyền tải dữ liệu.
Thay vì khai báo string ten; int tuoi; string diaChi;... bạn chỉ cần khai báo một struct SinhVien rồi dùng nó là xong. Nó giúp code của bạn trở nên "clean" và dễ đọc hơn rất nhiều, y như việc bạn dọn dẹp thư mục download vậy.
Cú pháp và Code Ví Dụ Minh Họa
Cú pháp của struct cũng "friendly" thôi, không có gì phức tạp cả. Bạn định nghĩa nó bằng từ khóa struct, sau đó là tên struct và bên trong là các thành viên (members) của nó.
#include <iostream>
#include <string>
// Định nghĩa một struct để lưu thông tin sinh viên
struct SinhVien {
std::string maSo;
std::string hoTen;
int tuoi;
double diemTrungBinh;
}; // Đừng quên dấu chấm phẩy ở cuối struct nhé!
int main() {
// Khai báo và khởi tạo một đối tượng (biến) kiểu SinhVien
SinhVien sv1;
sv1.maSo = "SV001";
sv1.hoTen = "Nguyễn Văn A";
sv1.tuoi = 20;
sv1.diemTrungBinh = 8.5;
// Truy cập và hiển thị thông tin sinh viên
std::cout << "--- Thông tin Sinh Viên ---" << std::endl;
std::cout << "Mã số: " << sv1.maSo << std::endl;
std::cout << "Họ tên: " << sv1.hoTen << std::endl;
std::cout << "Tuổi: " << sv1.tuoi << std::endl;
std::cout << "Điểm TB: " << sv1.diemTrungBinh << std::endl;
// Bạn cũng có thể khởi tạo trực tiếp khi khai báo (initializer list)
SinhVien sv2 = {"SV002", "Trần Thị B", 21, 9.2};
std::cout << "\n--- Thông tin Sinh Viên 2 ---" << std::endl;
std::cout << "Họ tên: " << sv2.hoTen << std::endl;
std::cout << "Điểm TB: " << sv2.diemTrungBinh << std::endl;
return 0;
}
Trong ví dụ trên, chúng ta định nghĩa một struct SinhVien với 4 thành viên. Sau đó, trong hàm main, chúng ta tạo hai biến kiểu SinhVien (sv1 và sv2), gán giá trị cho các thành viên của chúng bằng toán tử . (dot operator), và in ra màn hình.

Mẹo hay (Best Practices) từ thầy Creyt để "hack" kiến thức này
- Đặt tên có tâm: Đặt tên
structbằng chữ cái đầu viết hoa (PascalCase), ví dụSinhVien,Diem,SanPham. Tên các trường (members) thìcamelCasehoặcsnake_casetùy team quy định. Việc này giúp code của bạn trông chuyên nghiệp và dễ đọc hơn, như việc bạn đặt tên folder rõ ràng vậy. - Keep it Simple, Stupid (KISS):
structsinh ra để đóng gói dữ liệu. Tránh nhồi nhét quá nhiều logic phức tạp (các hàm xử lý) vàostruct. Nếu bạn thấy cần nhiều hàm (methods) để thao tác với dữ liệu đó, thì có thể đã đến lúc nghĩ đếnclassrồi đấy (sẽ học sau nhé). - Struct vs Class (Tóm tắt nhanh): Trong C++, điểm khác biệt chính giữa
structvàclasslà mặc định quyền truy cập.structmặc định làpublic(ai cũng thấy, ai cũng dùng được), cònclassmặc định làprivate(chỉ mình nó dùng). Về cơ bản, bạn có thể làm mọi thứ vớistructmà bạn làm vớiclass(trừ việc kế thừa ảo và một số thứ phức tạp khác). Tuy nhiên, quy ước chung là dùngstructcho các cấu trúc dữ liệu đơn giản, chủ yếu là dữ liệu (Plain Old Data - POD), cònclasscho các đối tượng phức tạp hơn với hành vi (methods) đi kèm. - Kích thước bộ nhớ: Một
structsẽ chiếm bộ nhớ bằng tổng kích thước các thành viên của nó (cộng thêm một chút do 'padding' để tối ưu hóa truy cập, nhưng cái này để sau đi, đừng lo vội). Hiểu nôm na là nó sẽ "đặt" các thành viên cạnh nhau trong bộ nhớ.
Ứng dụng thực tế (Chất như nước cất)
struct được sử dụng rộng rãi trong rất nhiều lĩnh vực của lập trình, từ cơ bản đến nâng cao:
- Cơ sở dữ liệu: Khi bạn lấy dữ liệu từ database, mỗi hàng (row) trong bảng có thể được biểu diễn gọn gàng bằng một
struct. Ví dụ, mộtstruct KhachHangchứaid,ten,email. - Đồ họa và Game: Các điểm tọa độ (x, y, z), màu sắc (R, G, B, A), vector, ma trận đều có thể là
struct. Tưởng tượng một nhân vật game, bạn cầnstruct ToaDođể biết nó đang ở đâu,struct MauSaccho trang phục. - Giao thức mạng: Dữ liệu được gửi qua mạng thường được đóng gói thành các gói tin (packets). Mỗi gói tin có thể được định nghĩa bằng một
structđể đảm bảo cấu trúc dữ liệu thống nhất. - Cấu trúc dữ liệu cơ bản: Danh sách liên kết (Linked List), cây (Tree), đồ thị (Graph) thường dùng
structđể định nghĩa các nút (node) của chúng, mỗi nút chứa dữ liệu và con trỏ tới nút khác.
Thử nghiệm đã từng và hướng dẫn nên dùng cho case nào
Khi nào nên dùng struct?
Khi bạn cần gom một nhóm các biến có liên quan logic với nhau thành một đơn vị duy nhất, và đơn vị đó chủ yếu là dữ liệu, không có quá nhiều hành vi phức tạp. struct lý tưởng cho các "value types" – những kiểu dữ liệu mà chúng ta quan tâm đến giá trị của chúng hơn là danh tính duy nhất của chúng.
Ví dụ điển hình:
struct Point { int x; int y; };(Một điểm trên mặt phẳng)struct Color { unsigned char r, g, b, a; };(Mã màu RGBA)struct Date { int day, month, year; };(Ngày tháng)
Thử nghiệm để "ngấm" kiến thức:
Hãy thử tạo một struct mới để lưu thông tin của một cuốn sách: tieuDe (string), tacGia (string), namXuatBan (int), giaTien (double). Sau đó, trong hàm main, hãy tạo 3 cuốn sách khác nhau, gán thông tin cho chúng và in toàn bộ thông tin của từng cuốn sách ra màn hình. Đó là cách tốt nhất để "ngấm" kiến thức này vào máu.
Tóm lại, struct là một công cụ mạnh mẽ nhưng đơn giản, giúp code của bạn gọn gàng, dễ đọc và dễ bảo trì hơn rất nhiều. Hãy coi nó như một người bạn đồng hành tin cậy trong hành trình chinh phục C++ nhé!
Thuộc Series: C++
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!