Các kiểu dữ liệu đã học qua như mảng và xâu giúp chúng ta thao tác trên dãy các số, chữ hay văn bản rất tốt. Nhưng chúng chi cho phép ta lưu trữ và xử lý các đối tượng cùng kiểu. Trong thực tế, các đối tượng mang nhiều thông tin khác nhau, mỗi thông tin này lại có một kiểu dữ liệu rất khác. Thầy lấy ví dụ thông tin về một cuốn sách gốm có:
Tựa đề
Tác giả
Năm xuất bản
Giá
Mã sách
Chương trình máy tính phải có khả năng lưu trữ được các thông tin trên vào một đối tượng gọi là sách. Hầu hết các ngôn ngữ lập trình đều có cách thức cho chúng ta làm việc này một cách dễ dàng. Trong C++, người ta dùng kiểu struct để định nghĩa dạng dữ liệu như vậy.
Struct [tên kiểu] {
thuộc tính 1: kiểu;
thuộc tính 2: kiểu;
thuôc tính 3: kiểu;
.....
thuộc tính n: kiểu;
};
Trong đó
Tên kiểu là tên tùy chọn do các em tự đặt để dùng về sau.
Các thuộc tính bên trong là các thông tin của một đối tượng, mỗi thông tin này có một kiểu riêng như int i, double j,....
Sau dấu mốc đóng nhớ có chấm phẩy ";"
Ví dụ sau đây khai báo một cấu trúc Books để mô tả thông tin các cuốn sách
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
Lưu ý cấu trúc Books này chưa đựa cấp phát bộ nhớ và cũng không sử dụng được. Khi nào khai báo biến thuộc kiểu struct đó thì bộ nhớ mới cấp cho biến với kích thước bằng tổng các thuộc tính cộng lại. Và đương nhiên, mọi thao tác là thông qua biến.
ví dụ:
struct Books book1, book2;
Chúng ta vừa khai báo hai biến book1, book2 có kiểu Books và mọi thao tác trên struct Books chỉ có thể thông qua hai biến này.
Để truy xuất được vào từng thuộc tính của struct, ta dùng dấu chấm "."
ví dụ:
book1.title;// truy xuất vào thuộc tính titil của book1
Sau khi đã biết cách truy xuất vào từng thuộc tính của một struct, thì mọi việc xử lý của nó tương tự như trên các biến đơn thông thường.
Ví dụ sau đây mô tả cách làm việc với với struct, với nhiệm vụ và gán thông tin vào hai quyển sách book1, book2 và in thông tin đó lên màn hình.
#include <iostream>
#include <cstring>
using namespace std;
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1; // Declare Book1 of type Book
struct Books Book2; // Declare Book2 of type Book
// book 1 specification
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// book 2 specification
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// Print Book1 info
cout << "Book 1 title : " << Book1.title <<endl;
cout << "Book 1 author : " << Book1.author <<endl;
cout << "Book 1 subject : " << Book1.subject <<endl;
cout << "Book 1 id : " << Book1.book_id <<endl;
// Print Book2 info
cout << "Book 2 title : " << Book2.title <<endl;
cout << "Book 2 author : " << Book2.author <<endl;
cout << "Book 2 subject : " << Book2.subject <<endl;
cout << "Book 2 id : " << Book2.book_id <<endl;
return 0;
}
Khi chạy chương trình, các em sẽ thấy kết quả chư sau:
Book 1 title : Learn C++ Programming
Book 1 author : Chand Miyan
Book 1 subject : C++ Programming
Book 1 id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Yakit Singha
Book 2 subject : Telecom
Book 2 id : 6495700
Truyền struc và hàm tương tự như các biến bình thường khác, ví dụ sau đây thực hiện lại in thông tin quyển sách như trên, nhưng giờ chúng ta dùng hàm để in thông tin sách, rồi gọi hàm đó cho hai quyển sách:
#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books book );
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1; // Declare Book1 of type Book
struct Books Book2; // Declare Book2 of type Book
// book 1 specification
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// book 2 specification
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// Print Book1 info
printBook( Book1 );
// Print Book2 info
printBook( Book2 );
return 0;
}
void printBook( struct Books book )
{
cout << "Book title : " << book.title <<endl;
cout << "Book author : " << book.author <<endl;
cout << "Book subject : " << book.subject <<endl;
cout << "Book id : " << book.book_id <<endl;
}
Chạy chương trình trên các em cũng thấy kết quả như ví dụ 1:
Book title : Learn C++ Programming
Book author : Chand Miyan
Book subject : C++ Programming
Book id : 6495407
Book title : Telecom Billing
Book author : Yakit Singha
Book subject : Telecom
Book id : 6495700
Với cách định nghĩa này, coi như chúng ta tạo ra được một kiểu mới, sau đó sử dụng kiểu bình thường như các kiểu chuẩn khác mà không cần phải kèm từ struct đi theo nữa
Ví dụ:
typedef struct
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
Ví dụ trên định nghĩa một kiểu tên là Books với cấu trúc có 4 thuộc tính, bây giờ sử dụng nó để khai báo biến như sau:
Books Book1, Book2;
Các em thấy rõ ràng khai báo gọn hơn, và tức nhiên khi truyền vào hàm cũng như vậy.