• 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 ñó... – Thực chất làgán tươngứng các thành phần dữliệucủa hai ñối tượng cho nhau.. • Sẽ ñượctự ñộng gọikhi khởi
Trang 1L Ớ P VÀ ðỐ I T ƯỢ NG
Ch ươ ng 3
1
N ộ i dung
N ộ 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
• D ữ li ệ u và hàm thành viên t ĩ nh
• Khai thác 1 l ớ p
2
L ớ p
L ớ p
• 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ểmtrong
không gian
2 chiều
L ớ p
L ớ p
• Đị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 )
Toán tử chỉ phạm vi
{
< 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 >
}
Trang 2L ớ p
L ớ p
• Ví dụ
5
ðố i t ượ ng
ðố 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];
6
a
x y
1000H
b
x y
x y
1008H
• 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;
ðố i t ượ ng
ðố i t ượ ng
Chú ý: Phảic pvàthu h ivùng nhớcho con trỏ ñối tượng
y
1060H 1060
x y
1064H
*ds 1064
• 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
ðố i t t ượ ượ ng ng
Trang 3• Ví dụ
ðố i
ðố i t t ượ ượ ng ng
9
• 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ệucủa hai ñối tượng cho nhau
– Chỉñ ñ úng úng khi thành ph ầ n d ữ li ệ ukhông có con trỏ
ðố i
ðố i t t ượ ượ ng ng
=> Phảiñịnh nghĩa lại phép gán khi dữliệu có con trỏ
10
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)
Hàm
Hàm xây xây d d ự ự ng ng – – Hàm h Hàm h ủ ủ y 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
cho các dữ liệu thành viên
• 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:
Hàm xây d ự ng Hàm xây d ự ng – – Hàm h Hàm h ủ ủ y y
– Cú pháp:
• Cùng tênvớ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ẽ ñượctự ñộng gọikhi khởi tạoñối tượng
Trang 4• Ví d ụ 1 v ề hàm xây d ự ng
class Diem {
int x,y;
public :
Diem();// xd mặ c nhiên
Diem( int );
void main() {
// Goi Diem()
Diem a;
// In (0,0)
a InDiem();
// Diem(int,int)
Diem b(10,5);
// Diem(int)
Hàm xây d ự ng
Hàm xây d ự ng – – Hàm h Hàm h ủ ủ y y
13
Diem( int );
Diem( int , int );
};
Diem::Diem()
{ x=y=0; }
Diem::Diem( int a)
{ x = y = a; }
Diem::Diem( int h, int t)
{ x=h; y=t; }
// 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];
}
• Ví d ụ 2 v ề hàm xây d ự ng
Hàm xây d ự ng Hàm xây d ự ng – – Hàm h Hàm h ủ ủ y y
14
• 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
Hàm xây d ự ng
Hàm xây d ự ng – – Hàm h Hàm h ủ ủ y 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;
}
Các lo ạ i ñố i t ượ ng Cá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àicá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 khihàm main() thực thi
• Sẽ ñược hủy bỏ( tự ñộng gọi hàm hủy cho ñối tượng ) sau khikết thúc hàm main()
– ðối tượng cục bộ :
• Khai báo trongmột hàm
• Sẽ khởi tạo trong khi thực thihàm ñó
• Sẽ ñược hủy bỏ( tự ñộng gọi hàm hủy cho ñối tượng ñó) trước khihàm kết thúc
Trang 5D ữ li ệ u và hàm thành viên t ĩ nh
D ữ 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ó
17
Tại thời ñiểm này
dem = ?
• 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êmstaticvào trước khai báo hàm trong lớp
D ữ li ệ u và hàm thành viên t ĩ nh
D ữ li ệ u và hàm thành viên t ĩ nh
– Giống như1 hàm toàn cục
18
Khai thác m ộ t l ớ p
Khai 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 Diem.cpp 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();
….
}
• 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,
Khai thác m ộ t l ớ p Khai thác m ộ t l ớ p
ta dùng các từ khóa tiền
xử lý
#ifndef
#define
#endif