Professional Documents
Culture Documents
Trong khi học NNLT, chúng ta đã được nghiên cứu về các kiểu dữ liệu cơ bản. Nếu
đã xem xong phần vòng lặp và mảng, bài toán đặt ra là để lưu trữ thông tin của các cư dân
của một thành phố. Ta có thể thiết kế một vài mảng string name[] - tên, string
phoneNumber[] - số điện thoại, string address[] - địa chỉ, v.v…
Vấn đề phát sinh là khi ta cần gán giá trị của một người người vào một biến, ta sẽ
phải thực hiện nhiều dòng lệnh gán
name[x] = “Nguyen Van A”;
phoneNumber[x] = “0123456789”;
address[x] = “ABC”;
...
Rất dài và rất dễ gây sai sót trong quá trình viết lệnh. Khi truyền thông tin của một
người vào trong hàm cũng sẽ nảy sinh nhiều phức tạp tương tự. Phương án để giải quyết
vấn đề này là tự định nghĩa một kiểu cấu trúc dữ liệu person với khả năng
Lưu trữ các thông tin cá nhân của đối tượng trên biến đó và cho phép truy cập hoặc
Trong C++, chúng ta có hai cách để tự định nghĩa cấu trúc dữ liệu.
I/. Dùng struct
1/. Để khai báo một kiểu cấu trúc dữ liệu mới với struct, ta sử dụng cú pháp
struct <tên_của_cấu_trúc>
{
định nghĩa các biến thành phần và hàm của cấu trúc dữ liệu;
} [khai báo biến thuộc cấu trúc dữ liệu này];
Tên của cấu trúc dữ liệu chính là tên của kiểu dữ liệu ta đang tạo ra - giống như
int, float là tên của các kiểu dữ liệu nguyên thủy.
Định nghĩa các biến thành phần và hàm giống như ta định nghĩa biến và hàm trong
chương trình.
Việc khai báo biến ngay sau khi định nghĩa cấu trúc dữ liệu là không bắt buộc, ta có
2/. Truy cập vào các biến thành phần của struct
Để truy cập vào các biến thành phần của một dữ liệu kiểu struct, ta sử dụng toán
tử dấu chấm (.).
Ví dụ minh họa:
#include <iostream>
using namespace std;
struct person
{
string name, phoneNumber, address;
};
int main()
{
person admin;
struct person
{
string name, phoneNumber, address;
void printData()
{
cout << name << '\n' << phoneNumber << '\n' << address << '\n';
}
};
int main()
{
person admin;
struct person
{
string name, phoneNumber, address;
person(string _name, string _phoneNumber, string _address)
{
name = _name;
phoneNumber = _phoneNumber;
address = _address;
}
void printData()
{
cout << name << '\n' << phoneNumber << '\n' << address << '\n';
}
};
int main()
{
person admin = person("Admin Tong Quan", "123", "The Internet");
void put(int x)
{
if (firstItem == NULL)
{
firstItem = new LinkedListItem();
firstItem->value = x;
}
else
firstItem->put(x);
}
void printAll()
{
if (firstItem != NULL)
firstItem->printAll();
}
};
Vậy là cấu trúc LinkedList đã được hoàn thành và có thể đem vào sử dụng
#include <iostream>
using namespace std;
struct LinkedListItem
{
int value;
LinkedListItem *next;
LinkedListItem()
{
value = 0;
next = NULL;
}
void put(int x)
{
if (next != NULL) // Nếu chưa phải phần tử cuối cùng
{
next->put(x); // Đẩy việc chèn phần tử cho phần tử tiếp theo
return;
}
next = new LinkedListItem();
next->value = x;
}
void printAll()
{
cout << value << '\n';
if (next != NULL)
next->printAll();
}
};
struct LinkedList
{
LinkedListItem *firstItem;
LinkedList()
{
firstItem = NULL;
}
void put(int x)
{
if (firstItem == NULL)
{
firstItem = new LinkedListItem();
firstItem->value = x;
}
else
firstItem->put(x);
}
void printAll()
{
if (firstItem != NULL)
firstItem->printAll();
}
};
int main()
{
LinkedList list;
list.put(1);
list.put(2);
list.printAll();
list.put(5);
list.printAll();
return 0;
}
Output
1
2
1
2
5
II/. Class
Để khai báo cấu trúc với class, ta sử dụng cú pháp
class <tên_của_class>
{
định nghĩa các biến và hàm của class;
} [Khai báo một số biến kiểu class này];
Nó có khác gì so với struct?
Câu trả lời là giống nhau.
Thật ra là có khác nhau ở một số điểm sau:
Quyền truy cập các biến và hàm của struct mặc định là public - tất cả mọi thứ
đều có thể truy cập được. Của class là private - giới hạn trong nội bộ class.
Điều này có ý nghĩa gì, ta sẽ học trong các bài sau.
Về mặt ngữ nghĩa của mã nguồn: struct thường được gắn liền với các kiểu dữ
liệu Plain Old Data (POD) - kiểu dữ liệu chỉ bao gồm các biến dữ liệu được gom lại
trong cùng một cấu trúc. Trong khi đó class được gắn liền với việc lập trình
hướng đối tượng và các kiểu dữ liệu phức tạp hơn, có bao gồm các hàm và chương
trình con trong đó.
class cũng có hàm bên trong cấu trúc dữ liệu, con trỏ, cấp phát bộ nhớ động, tất cả
mọi thứ mà struct có. Các template trong thư viện STL của C++ được triển khai như là
các class. Class cũng là thuật ngữ trong lập trình hướng đối tượng.
Do đó, để tìm hiểu về Lập trình hướng đối tượng với C++, chúng ta sẽ đi sâu hơn về
class, và sử dụng class cho mọi trường hợp thay vì struct.
Bài viết tìm hiểu về kiểu dữ liệu có cấu trúc xin dừng ở đây.
Người viết