I. Kết hợp các dữ liệu khác kiểu với nhau
Trong tình huống khi chúng ta cần lưu trữ thông tin của nhiều cuốn sách trong thư viện, với các thuộc tính như tiêu đề, tác giả, thể loại và ID, ta gặp khó khăn vì các kiểu dữ liệu nguyên thủy không đủ để chứa đồng thời nhiều thông tin như vậy. Để giải quyết vấn đề này, lập trình viên phải tạo ra các kiểu dữ liệu mới để lưu trữ thông tin đầy đủ của một cuốn sách (đây là kiểu dữ liệu tự định nghĩa như đã được đề cập trong những bài trước). Trong ngôn ngữ lập trình C++, chúng ta có hai loại dữ liệu hỗ trợ cho mục đích này là "struct" (cấu trúc) và "class" (lớp).
Tuy nhiên, trong phạm vi lập trình cơ bản, ta thường sử dụng "struct" để tạo kiểu dữ liệu tự định nghĩa và việc sử dụng nó khá đơn giản. Có thể hiểu "struct" như một loại bản ghi, dùng để lưu trữ các thông tin chung của nhiều đối tượng dữ liệu. Ví dụ, trong hệ thống của trường đại học, mọi bản ghi sinh viên đều chứa thông tin như tên, mã số sinh viên, ngày tháng năm sinh và ngành học; hoặc như trong trường hợp lưu trữ thông tin về các cuốn sách như đã đề cập ở trên,...
II. Định nghĩa một cấu trúc
1. Định nghĩa và khai báo các biến cấu trúc
Để định nghĩa một cấu trúc, ta sử dụng cú pháp như sau:
Trong đó, "{Tên_cấu_trúc}" là một định danh tùy ý do người dùng đặt (thông thường, tên cấu trúc sẽ viết hoa chữ cái đầu tiên). "{Định_nghĩa_thành_viên}" là một khai báo biến thuộc các kiểu dữ liệu khác nhau, còn "{Danh_sách_các_biến_cấu_trúc}" là các định danh tên biến.
Ví dụ: Định nghĩa một cấu trúc Books lưu thông tin về tên, tác giả, thể loại và ID của một cuốn sách, sau đó khai báo ba biến cấu trúc thể hiện ba cuốn sách:
Ngoài cách khai báo liền các biến cấu trúc như trên, người dùng có thể khai báo biến cấu trúc ở bất kỳ đâu trong chương trình bằng cú pháp: "{Tên_cấu_trúc} {Tên_biến_cấu_trúc};", như ví dụ dưới đây:
2. Khai báo các biến cấu trúc với từ khóa typedef
Từ khóa "typedef" là một khái niệm rất hữu ích trong lập trình, giúp người dùng tạo ra các tên mới cho các kiểu dữ liệu, bao gồm cả kiểu dữ liệu nguyên thủy và kiểu dữ liệu người dùng tự định nghĩa. Bạn có thể định nghĩa một cấu trúc với tên cố định bằng cú pháp:
Ví dụ, cấu trúc Books ở trên có thể viết lại như sau:
Kể từ khai báo này trở đi, các biến cấu trúc cũng có thể được khai báo bằng cú pháp tương tự như khai báo biến kiểu nguyên thủy thông thường:
Tuy nhiên, cách khai báo với từ khóa "typedef" và "struct" không phổ biến lắm trong lập trình vì nó không giúp giảm công sức lập trình viên. Thông thường, ta chỉ sử dụng "typedef" khi có những kiểu dữ liệu quá dài, ví dụ như "pair" hay "unsigned long long", và ta muốn viết ngắn gọn hơn bằng cách đặt lại tên mới cho kiểu dữ liệu đó:
III. Các thao tác với cấu trúc
1. Truy cập các thành viên của một biến cấu trúc
Để truy cập tới các thành viên trong một cấu trúc, ta sử dụng cú pháp sau:
Khi truy cập theo cách này, người dùng có thể sử dụng thành viên được truy cập như một biến độc lập, kết hợp với các phép toán và câu lệnh khác nhau. Ví dụ, ta có thể nhập xuất tên sách của biến cấu trúc "book_1" có kiểu là "Sách" bằng cú pháp:
2. Gán giá trị cho một biến cấu trúc
Biến cấu trúc cung cấp một phép toán gán rất hữu ích. Khi muốn gán giá trị cho các thành viên của một biến cấu trúc gồm n thành viên, ta có thể sử dụng cú pháp sau:
Khi đó, các {Giá_trị_1}, {Giá_trị_2},..., {Giá_trị_n} sẽ lần lượt được gán cho các {Thành_viên_1}, {Thành_viên_2},..., {Thành_viên_n} của biến struct
. Lấy ví dụ:
Biên dịch và chạy đoạn chương trình trên, ta có kết quả là:
3. Truyền cấu trúc vào hàm như một tham số
Ta có thể truyền cấu trúc vào hàm dưới dạng một tham số giống như những biến thông thường, và cũng sẽ có truyền tham chiếu hoặc truyền tham trị. Cú pháp truyền không có gì khác biệt:
Nếu muốn truyền tham chiếu, chỉ cần thêm toán tử "&" phía trước tên biến tham số. Các đối tượng trong cấu trúc chỉ tương tự như các biến thông thường, do đó có thể kết hợp với các câu lệnh như các biến.
Ví dụ: Dưới đây là một đoạn chương trình cho phép nhập chiều dài và chiều rộng của N hình chữ nhật khác nhau và sử dụng một hàm để tính diện tích của các hình chữ nhật đó: