Xin chào các bạn! Trong bài viết này, chúng ta sẽ cùng đi tìm hiểu về lớp và đối tượng trong lập trình c' class='hover-show-link replace-link-1748'>ngôn ngữ lập trình c ++. Chúng ta sẽ hiểu rõ về cách truy cập và các phạm vi truy cập của dữ liệu thành viên.
Lớp và đối tượng trong C++
Ngôn ngữ c+ + là một phiên bản nâng cấp từ ngôn ngữ C, với tính năng hướng đối tượng được bổ sung. Các lớp (class) là trọng tâm của C++ và hỗ trợ lập trình hướng đối tượng. Chúng thường được gọi là các kiểu người dùng tự định nghĩa.
Một lớp được sử dụng để định nghĩa cấu trúc của một đối tượng và kết nối dữ liệu và các phương thức để thao tác với dữ liệu trong một gói với sự gọn gàng. Dữ liệu và hàm bên trong một lớp được gọi là các thành viên của lớp đó.
Định nghĩa lớp
Lớp (Class) có thể được coi như là một bản thiết kế của các đối tượng (Object). Nó là một kiểu dữ liệu do người dùng định nghĩa, chứa các thành viên dữ liệu và các phương thức thành viên riêng của mình.
Hãy cùng xem một ví dụ thực tế. Giả sử chúng ta có các sinh viên. Mỗi sinh viên có các thuộc tính chung như: mã sinh viên, tên, tuổi, quê quán, điểm toán, điểm lý, điểm hóa, và các hành vi như: đi, đứng, ngồi, học tập,... Do đó, chúng ta có thể coi sinh viên là một lớp (Class). Lớp "sinhvien" có các thành viên là: mã sinh viên, tên, tuổi, quê quán, điểm toán, điểm lý, điểm hóa, và các hành vi như: đi, đứng, ngồi, học tập,...
Vì lớp là một kiểu dữ liệu do người dùng định nghĩa, nó bao gồm các thành viên dữ liệu và các hàm thành viên. Các thành viên dữ liệu là các biến dữ liệu và các hàm thành viên là các hàm được sử dụng để thao tác với các biến và xác định thuộc tính và hành vi của các đối tượng trong lớp.
Trong ví dụ trên, lớp "sinhvien" sẽ có các:
- Thuộc tính (Attribute): mã sinh viên, tên, tuổi, quê quán, điểm toán, điểm lý, điểm hóa,...
- Hành vi (Method): đi, đứng, ngồi, học tập,...
Trong C++, để định nghĩa một lớp, chúng ta bắt đầu bằng từ khóa class
, tiếp theo là tên của lớp và phần thân lớp được bao bởi cặp dấu {}. Kết thúc lớp bằng dấu ;.
class sinhvien { private: string masinhvien, ten, quequan; int tuoi; float diemtoan, diemly, diemhoa; public: void di(); void dung(); void ngoi(); void hoctap(); };
Từ khóa private
và public
quyết định các thuộc tính truy cập của các thành viên lớp mà theo sau nó.
Định nghĩa đối tượng
trong lập trình hướng đối tượng, đối tượng (Object) là một thực thể trừu tượng của một sự vật trong thế giới thực, được con người mô hình hóa và ghi lại những tính chất và hành vi, tạo nên thuộc tính và phương thức của đối tượng.
Khi một lớp (Class) được định nghĩa, chỉ có đặc tả cho đối tượng được xác định. Do đó, các đối tượng sẽ không được khởi tạo, tức là không có bộ nhớ hoặc không có không gian lưu trữ được phân bổ cho các đối tượng thuộc lớp đó. Để sử dụng dữ liệu và các hàm được xác định trong lớp, bạn cần khai báo các đối tượng.
Cú pháp:
sinhvien obj_1; sinhvien obj_2;
Cả hai đối tượng obj_1
và obj_2
sẽ có các bản sao riêng của các thành viên dữ liệu (Data Member). Ví dụ, đối tượng obj_1
sẽ có các phương thức: mã sinh viên, tên, tuổi, quê quán, điểm toán, điểm lý, điểm hóa,... và các hành vi: đi, đứng, ngồi, học tập,... riêng so với đối tượng obj_2
.
Nghĩa là các dữ liệu thành viên của obj_1
sẽ không bị thay đổi khi dữ liệu thành viên của obj_2
thay đổi và các dữ liệu thành viên của obj_1
cũng sẽ không thể truy cập, tác động đến dữ liệu thành viên của obj_2
.
Truy cập các dữ liệu thành viên
Để truy cập vào thành viên dữ liệu của đối tượng, chúng ta sử dụng toán tử truy cập thành viên trực tiếp là dấu chấm .
.
Ví dụ, nếu muốn truy cập vào phương thức di()
của đối tượng obj_1
, thì cú pháp sẽ là:
obj_1.di();
Chúng ta cùng xem ví dụ khác:
#include using namespace std; class connguoi { public: string hoten; int tuoi; public: void set() { cout << "Nhập Họ Tên: "; fflush(stdin); // Xóa bộ đệm getline(cin, this->hoten); cout << "Nhập Tuổi: "; cin >> this->tuoi; } }; int main() { connguoi obj; // Khai báo obj là 1 đối tượng trong lớp connguoi obj.set(); cout << "Họ Tên: " << obj.hoten << endl; cout << "Tuổi: " << obj.tuoi << endl; return 0; }
Ta nhập Input: Nguyen Van A 18
Kết quả: Họ Tên: Nguyen Van A Tuổi: 18
Điều quan trọng cần nhớ là:
- Các thành viên public cũng được truy cập bằng toán tử
.
. - Nhưng các thành viên private và protected không thể được truy cập một cách trực tiếp bằng toán tử truy cập thành viên trực tiếp này.
Các loại phạm vi truy cập
Phạm vi truy cập là cách mà người lập trình quy định về quyền truy xuất đến các thành phần của lớp.
Trong C++, có 3 loại phạm vi chính là: private
, protected
, public
.
Phạm Vi Truy Cập | Ý Nghĩa |
---|---|
public | Không hạn chế. Thành phần có thuộc tính này có thể được truy cập ở bất kỳ vị trí nào. |
private | Thành phần có thuộc tính này chỉ được truy cập từ bên trong lớp. Bên ngoài lớp hay trong lớp dẫn xuất sẽ không thể truy cập được. |
protected | Mở rộng hơn private một chút. Thành phần có thuộc tính này sẽ có thể truy cập ở trong nội bộ lớp và trong lớp dẫn xuất (lớp dẫn xuất sẽ được trình bày trong bài Tính Kế Thừa). |
Hàm thành viên trong lớp
Trong C++, chúng ta có 2 cách để xác định hàm thành viên:
- Xác định bên trong lớp.
- Xác định bên ngoài lớp.
Với ví dụ về lớp connguoi
bên trên, hàm set()
là một hàm được xác định bên trong lớp.
Còn để xác định một hàm thành viên bên ngoài lớp, chúng ta phải sử dụng toán tử scope ::
kèm theo tên lớp và tên phương thức.
#include using namespace std; class connguoi { public: string hoten; int tuoi; public: void set(); }; void connguoi :: set() { cout << "Nhập Họ Tên: "; fflush(stdin); // Xóa bộ đệm getline(cin, this->hoten); cout << "Nhập Tuổi: "; cin >> this->tuoi; } int main() { connguoi obj; // Khai báo obj là 1 đối tượng trong lớp connguoi obj.set(); cout << "Họ Tên: " << obj.hoten << endl; cout << "Tuổi: " << obj.tuoi << endl; return 0; }
Trong phần code bên trên, mình chỉ khai báo void set();
bên trong lớp. Sau đó, dùng toán tử ::
để gọi lại tên hàm đó và viết các câu lệnh thực hiện.
Một vài lưu ý:
- Tất cả các hàm thành viên được định nghĩa bên trong lớp mặc định là inline, nhưng bạn cũng có thể định nghĩa các hàm không thuộc lớp bằng cách sử dụng từ khóa
inline
. Inline là cách gọi tắt của Inline Function. Nó là các hàm nội tuyến. Hàm nội tuyến là các hàm thực tế, được sao chép ở mọi nơi trong quá trình biên dịch, giống như macro tiền xử lý, do đó giúp tiết kiệm được thời gian gọi hàm. - Khai báo hàm
friend
là một cách để cấp quyền truy cập riêng và nó không phải là một hàm thành viên.
Bài viết của mình xin được kết thúc tại đây. Mình rất mong nhận được ý kiến đóng góp của các bạn bằng cách để lại comment phía dưới, để bài viết của mình ngày càng hoàn thiện hơn. Chào tạm biệt và hẹn gặp lại trong bài viết tiếp theo.
*Một số tài liệu tham khảo:
- GeeksforGeeks
- W3Schools*