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... Đối tượng 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
Trang 1LỚP VÀ ĐỐI TƯỢNG
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
Trang 2 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 3 Đị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 4 Ví dụ
Trang 5Đố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
x y 1008H
Trang 6Đối tượng
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
1060
x
1064H
*ds 1064
Trang 7Đối tượng
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 đó
Trang 8Đối tượng
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 đú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;
b = a; b.InDiem(); // In ra (10, 20)
pb = new Diem ; *pb = a; pb->InDiem(); // In ra (10, 20)
Trang 9Hà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 10Hàm xây dựng – Hàm hủy
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 :
Không được gọi trực tiếp
Sẽ được tự động gọi khi khởi tạo đối tượng
Trang 11Hàm xây dựng – Hàm hủy
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; }
void main() { Diem a; // Goi Diem()
a InDiem(); // In (0,0)
Diem b(10,5); // Diem(int,int)
Diem c(3); // Diem(int)
Diem *pa = new Diem();
Diem *pb = new Diem(10,5);
Diem *pc = new Diem(3);
Diem ds1[10]; // Goi Diem()
Diem *ds2 = new Diem [10];
// Goi Diem()
Trang 12Hàm xây dựng – Hàm hủy
Ví dụ 2 về hàm xây dựng
Trang 13Hàm xây dựng – Hàm hủy
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() {
Trang 14Cá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 đó.
Sẽ được hủy bỏ ( tự động gọi hàm hủy cho đối tượng đó)
trước khi hàm kết thúc.
Trang 15Dữ 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 16Dữ liệu và hàm thành viên tĩnh
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
Trang 17Khai 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 18Khai thác một lớp
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 #endif