Bài giảng Lập trình hướng đối tượng C++ - Chương 3: Lớp và đối tượng cung cấp cho người học những kiến thức như: Lớp: khai báo, định nghĩa hàm thành viên; Đối tượng: khai báo, sử dụng, gán; Sơ lược về hàm xây dựng, hàm hủy; Dữ liệu và hàm thành viên tĩnh; Khai thác 1 lớp. Mời các bạn cùng tham khảo!
Trang 1LỚP VÀ ĐỐI TƯỢNG
Chương 3
Trang 2Nội dung
• Lớp : khai báo, định nghĩa hàm thành viên.
• Đối tượng : khai báo, sử dụng, gán.
• Sơ lược về hàm xây dựng, hàm hủy
• Dữ liệu và hàm thành viên tĩnh
• Khai thác 1 lớp
Trang 3• Khai báo
class < Tên lớp > {
Thuộc tính truy cập :
<Khai báo thành phần dữ liệu>
Thuộc tính truy cập :
<Khai báo các hàm thành viên>
};
Sơ đồ lớp
điểm trong
không gian
2 chiều
Trang 4• Định nghĩa hàm thành viên
<Kiểu trả về> <Tên lớp> :: <Tên hàm>( Các tham số + Kiểu ) {
< Khai báo các dữ liệu cục bộ của hàm>
< Thân hàm - Nội dung hàm >
< Câu lệnh return >
Toán tử chỉ phạm vi
Trang 5• Ví dụ
Trang 6Đối tượng
• Khởi tạo đối tượng
– Dạng biến: <Tên lớp> <Tên đối tượng>;
VD: Diem a, b;
– Dạng mảng: <Tên lớp> <Tên mảng>[Kích thước];
VD: Diem mang[10];
a
x y
1000H
x y 1008H
Trang 7• Khởi tạo đối tượng
– Dạng con trỏ :
VD: Diem *pa, *ds;
pa= new Diem; ds= new Diem[10];
delete pa; delete[] ds;
Chú ý:Phải cấp và thu hồi vùng nhớ cho con trỏ đối tượng
y
1060H
106 0
x
1064H
*ds 106 4
Đối tượng
Trang 8• Sử dụng đối tượng
– Khi khởi tạo đối tượng xong, ta có thể :
• Truy xuất đến dữ liệu thành viên của đối tượng
• Gọi hàm trên đối tượng
tùy theo thuộc tính truy cập của các thành phần đó
Đối tượng
Trang 9• Ví dụ
Đối tượng
Trang 10• Phép gán đối tượng:
– Dùng dấu = ( có sẵn trong ngôn ngữ C++)
– Thực chất là gán tương ứng các thành phần dữ liệu của hai đối tượng cho nhau
– Chỉ đúng khi thành phần dữ liệu không có con trỏ
=> Phải định nghĩa lại phép gán khi dữ liệu có con trỏ
void main() {
Diem a; a.KhoiTao(10,20);
Diem b, *pb;
Đối tượng
Trang 11Hàm xây dựng – Hàm hủy
• Hàm xây dựng (Constructor)
– Tại sao cần hàm xây dựng ?
hiệu ứng phụ
Cần phải khởi tạo giá trị ban đầu
Trang 12• Hàm xây dựng (constructor)
– Dùng để khởi tạo đối tượng:
• Gán giá trị đầu cho các dữ liệu thành viên
• Cấp vùng nhớ cho các con trỏ thành viên
– Cú pháp:
• Cùng tên với tên lớp, không có trị trả về (kể cả void)
• Có thể không có hay có nhiều tham số
• Có thể không có, có 1 hay nhiều hàm xây dựng
– Sử dụng :
Hàm xây dựng – Hàm hủy
Trang 13• Ví dụ 1 về hàm xây dựng
class Diem {
int x,y;
public:
Diem();// xd mặc nhiên
Diem(int);
Diem(int,int);
};
Diem::Diem()
{ x=y=0; }
Diem::Diem(int a)
{ x = y = a; }
Diem::Diem(int h, int t)
void main() {
// Goi Diem()
Diem a;
// In (0,0)
a InDiem();
// Diem(int,int)
Diem b(10,5);
// Diem(int)
Diem c(3);
Diem *pa = new Diem();
Diem *pb = new Diem(10,5); Diem *pc = new Diem(3);
// Goi Diem()
Diem ds1[10];
// Goi Diem()
Diem *ds2 = new Diem [10];
Hàm xây dựng – Hàm hủy
Trang 14• Ví dụ 2 về hàm xây dựng
Hàm xây dựng – Hàm hủy
Trang 15• Hàm hủy (destructor)
– Dùng để thu hồi vùng nhớ đã cấp cho các dữ liệu thành viên là con trỏ của đối tượng, khi hủy bỏ đối tượng
=> delete các con trỏ là dữ liệu thành viên
– Một lớp có thể không có hoặc chỉ có duy nhất 1 hàm hủy – Cú pháp : ~<Tên lớp> ( ) { … }
– Không được gọi trực tiếp mà sẽ được tự động gọi khi hủy
bỏ đối tượng
VD: Diem::~Diem () { }
SinhVien::~SinhVien() {
delete[] hoten;
Hàm xây dựng – Hàm hủy
Trang 16Các loại đối tượng
• Đối tượng toàn cục - Đối tượng cục bộ
– Đối tượng toàn cục :
• Khai báo ngoài các lớp và ngoài hàm main()
• Sẽ được khởi tạo (tự động gọi hàm xây dựng tương ứng) trước khi hàm main() thực thi
• Sẽ được hủy bỏ ( tự động gọi hàm hủy cho đối tượng )
sau khi kết thúc hàm main()
– Đối tượng cục bộ :
• Khai báo trong một hàm
• Sẽ khởi tạo trong khi thực thi hàm đó
Trang 17Dữ liệu và hàm thành viên tĩnh
• Dữ liệu thành viên tĩnh (static)
– Là dữ liệu thành viên dùng chung cho tất cả các đối tượng của cùng 1 lớp => tồn tại độc lập với các đối tượng
– Giống như 1 biến toàn cục
– Phải được khởi tạo bên ngoài của lớp
– Thường được sử dụng để đếm số lượng đối tượng hiện có
Trang 18• Hàm thành viên tĩnh (static)
– Độc lập với các đối tượng
=> khi gọi hàm không cần đối tượng nào :
<Tên lớp>::<Tên hàm> (danh sách tham số)
– Chỉ cần thêm static vào trước khai báo hàm trong lớp – Giống như 1 hàm toàn cục
Dữ liệu và hàm thành viên tĩnh
Trang 19Khai thác một lớp
• Khai báo lớp : file <tên lớp>.hpp
• Định nghĩa hàm thành viên : file <tên lớp>.cpp
• Sử dụng lớp : trong 1 file khác vidu.cpp
Diem.hpp
class Diem {
int x,y;
};
Diem.cpp
#include “Diem.hpp”
Diem::Diem() {… }
void Diem::InDiem() { … }
Vidu.cpp
#include “Diem.cpp”
void main () { Diem a;
a.InDiem();
….
}
Trang 20• Tránh định nghĩa lớp nhiều lần :
Để tránh #include nhiều lần một lớp có trong
nhiều tập tin khác nhau,
ta dùng các từ khóa tiền
xử lý
#ifndef
#define
Khai thác một lớp