Professional Documents
Culture Documents
1
NỘI DUNG
• Định nghĩa lớp là tạo ra một kiểu dữ liệu trừu tượng mới để
mô tả các đặc trưng của đối tượng trong thực tế.
▪Khai báo lớp: khai báo các dữ liệu và hàm thành phần
(phương thức) tạo nên lớp
▪Định nghĩa lớp: định nghĩa cụ thể các hàm thành phần của
lớp
CSE224 - Lớp và đối tượng 3
KHAI BÁO LỚP
class tên-lớp-được-định-nghĩa
{
private: //khai báo vùng che giấu riêng của lớp
khai báo các dữ liệu
khai báo các phương thức
protected: //khai báo vùng bảo vệ của lớp
khai báo các dữ liệu
khai báo các phương thức
public: //khai báo vùng dùng chung của lớp
khai báo các dữ liệu
khai báo các phương thức
};
CSE224 - Lớp và đối tượng 4
KHAI BÁO LỚP
❑Các dữ liệu và hàm thành phần của lớp được mô tả với 3 mức khác
nhau:
▪private: sở hữu riêng, dùng để khai báo các thành viên là riêng của chỉ lớp đó
và không thể truy cập từ các lớp khác được dùng với mục đích che giấu
thông tin của lớp
▪protected: chế độ bảo vệ, khai báo các thành phần của riêng lớp đó và các lớp
kế thừa nó có thể truy cập được còn các lớp khác không truy cập được
▪public: dùng chung, dùng khai báo các thành phần có thể truy cập từ mọi nơi
truy cập được từ bên ngoài lớp
❑Chú ý: Nếu không có từ khóa private thì mặc định hiểu là thuộc vùng
private
Định nghĩa lớp về nhân viên bao gồm dữ liệu thành viên: mã
nhân viên, họ tên, năm sinh, chuyên môn, bậc lương.
Hàm thành viên: nhap();
xuat();
❑Định nghĩa hàm thành phần là thao tác định nghĩa cụ thể
các hàm – thao tác của lớp được thực hiện như thế nào?
❑Các hàm thành phần của lớp được định nghĩa theo hai
cách:
▪Định nghĩa từ bên ngoài khai báo lớp
❑ Định nghĩa ngay tại vị trí các hàm thành phần trong
phần mô tả và khai báo lớp
Định nghĩa các hàm thành viên: nhap(), xuat() cho lớp nhân
viên
Định nghĩa các hàm thành viên: nhap(), xuat() cho lớp nhân
viên
❑Để sử dụng lớp đối tượng phải tạo ra các đối tượng khai báo biến
kiểu class đã được định nghĩa
❑Ví dụ:
date ngaysinh;
❑Để truy cập đến từng thành phần đối tượng thông qua tên biến kiểu
class đã được khai báo và toán tử dấu chấm (.) theo dạng sau:
Tên-biến-đối-tượng.dữ-liệu-thành-phần;
Tên-biến-đối-tượng.hàm-thành-phần(ds đối số);
❑Ví dụ: ngaysinh.ngay
ngaysinh.thang
ngaysinh.nhap( );
ts = ngaysinh.get_thang( );
❑Đối với các thành viên dữ liệu của lớp đối tượng đang định
nghĩa:
▪Gán dữ liệu cho đối tượng: thực hiện thay đổi từng thành phần dữ
liệu của đối tượng
▪Thay đổi các dữ liệu private của lớp: chỉ các phương thức của lớp
mới có quyền thay đổi giá trị các thành phần riêng của lớp
▪Thay đổi các dữ liệu trong thành phần public: có thể được thực hiện
bằng bất cứ thành phần nào của lớp
• Lớp là một kiểu đầy đủ: giống như các kiểu dữ liệu
int, double, …
• Biến của một kiểu lớp: được gọi là đối tượng
• Tham số của một kiểu lớp: có thể truyền giá trị, truyền
tham biến
• Có thể sử dụng kiểu lớp giống như bất kỳ kiểu dữ liệu
nào khác
23
Đóng gói
24
Nguyên tắc lập trình hướng đối tượng
Chỉ cho phép vận hành bởi các thao tác (hàm thành viên)
26
Ví dụ về public và private
• Ví dụ:
class DayOfYear {
public:
void input();
void output();
private:
int month; int day;
};
27
Ví dụ public và private
28
Ví dụ so sánh
29
Ví dụ áp dụng
Cho khai báo lớp nhân viên
với các biến trong khu vực
private.
Định nghĩa các hàm thành
viên của lớp.
Xây dựng hàm main() nhập
thông tin cho 2 nhân viên
(nhập lại mã nếu trùng)
Kiểm tra xem 2 nhân viên có
cùng bậc lương hay không?
28
Ví dụ áp dụng
19
Ví dụ áp dụng
19
Con trỏ this
❑ Mỗi một lớp trong nó luôn có một con trỏ mặc định là con trỏ this, con trỏ
để mô tả chính đối tượng lớp đang định nghĩa.
❑ Các hàm thành phần của lớp luôn có tham số đầu tiên là con trỏ this.
class PS
{
public:
int ts, ms;
void nhap(); // void nhap( PS *this );
PS cong( PS b ); //PS cong( PS *this , PS b );
};
CSE224 - Lớp và đối tượng 39
Con trỏ this
❑Truy cập đến thành phần con trỏ this
this->tên_thành_phần tên_thành_phần
Ví dụ:
void PS::nhap() void PS::nhap()
{ {
cout<<“Tu:”; cout<<“Tu:”;
cin>>ts; cin>>this->ts;
cout<<“Mau:”; cout<<“Mau:”;
cin>>ms; cin>>this->ms;
} }
CSE224 - Lớp và đối tượng 40
NỘI DUNG:
❑ Không thể kế thừa, nhưng lớp dẫn xuất vẫn có thể gọi constructor
của lớp cơ sở
42
Lớp không có hàm tạo
class diem_dh
{
private:
float m1,m2,m3;
public:
void in()
{
cout <<"\n " << m1 << " "<<m2<" " << m3 ;
}
};
Chú ý:
- Nếu trong lớp không có hàm tạo, chương trình dịch sẽ cung cấp một hàm tạo
mặc định không đối
- Nếu trong lớp đã có ít nhất một hàm tạo thì hàm tạo mặc định sẽ không được
phát sinh nữa
42
Định nghĩa hàm tạo – cách 1
35
Định nghĩa hàm tạo – cách 2
35
Hàm tạo không đối số
• Khai báo đối tượng không có các khởi tạo (gọi hàm tạo):
ngay_thang date1; // Đúng!
ngay_thang date(); // Sai!
40
Gọi hàm tạo
Cho định nghĩa lớp ngày trong năm như sau:
33
Gọi hàm tạo
• Khai báo đối tượng:
ngay_thang date1(7, 4), date2(5, 5);
• Các đối tượng được tạo theo cách:
1. Hàm tạo ngay_thang được gọi (hai đối tượng date1 và date2 được tạo)
2. Các giá trị trong ngoặc được truyền như là các đối số cho hàm tạo
3. Các biến thành viên thang, d được khởi tạo:
date1 có: thang = 7 ; ngay = 4
date2 có: thang = 5 ; ngay = 5
33
Gọi hàm tạo
• Xét ví dụ:
Không thể gọi hàm tạo giống như các hàm thành viên khác (không
dùng toán tử . để gọi hàm) mà được gọi trực tiếp khi khai báo đối
tượng
34
Ví dụ
Định nghĩa lớp ngày trong năm với hàm tạo không
tham số thông báo đối tượng đã được tạo ra. Viết
chương trình nhập vào ngày, tháng sinh của 2 người.
In ra ngày, tháng sinh của 2 người vừa nhập và kiểm
tra xem hai người có cùng sinh nhật với nhau hay
không.
29
Gọi hàm tạo tường minh
➢ Có thể gọi lại hàm tạo sau khi đối tượng được khai báo,
➢ Lời gọi như vậy tạo ra một “đối tượng vô danh”, sau đó
được gán cho đối tượng hiện tại.
Ví dụ:
DayOfYear holiday(1, 1); //Hàm tạo được gọi
➢ Sau đó hàm tạo có thể được gọi lại:
Ví dụ muốn thay đổi dữ liệu trong holiday
holiday = DayOfYear(9, 2);
41
Nạp chồng hàm tạo
• Có thể nạp chồng hàm tạo giống như những hàm khác
• Nhắc lại: một hàm bao gồm
Tên hàm
Danh sách tham số
• Cung cấp các hàm tạo với tất cả các danh sách tham
số có thể có
36
Ví dụ về nạp chồng hàm tạo
Định nghĩa lớp ngay_thang với các hàm tạo và hàm output(),
trong đó:
- Hàm tạo không đối ngay_thang(): khởi tạo là ngày đầu tiên
trong năm
- Hàm tạo 1 đối ngay_thang(int gia_tri_thang): khởi tạo ngày
đầu tiên của tháng
- Hàm tạo 2 đối ngay_thang(int gia_tri_thang, int gia_tri_ngay):
khởi tạo ngày tháng với tham số đầu vào
Định nghĩa 3 đối tượng sử dụng các hàm tạo trên và in ra kết
quả khởi tạo.
36
Ví dụ về nạp chồng hàm tạo
Định nghĩa lớp ngay_thang
36
Hàm tạo sao chép
Tên_lớp ( const Tên_lớp &đối_tượng )
{
// Các lệnh dùng các thuộc tính của đối tượng
//khởi gán cho các thuộc tính của đối tượng mới
……
}
❑ Ví dụ: ~date( );
CSE224 - Lớp và đối tượng 68
Tách biệt giao diện và sự thực thi
➢ Người dùng lớp không cần xem chi tiết về việc lớp được
thực thi như thế nào
➢ Người dùng chỉ cần các luật
Được gọi là giao diện của lớp
Trong C++, bao gồm các hàm thành viên và các chú thích liên quan
30
Bài tập (tiếp)
Thông tin được hiển thị như sau (ví dụ: Học phí là 335.000/1TC)
52
NỘI DUNG:
◦ Một đối tượng thay đổi nó -> tất cả đều thấy sự thay đổi
52
Biến tĩnh
• Đặt từ khóa static trước kiểu của biến trong khai báo
• Khởi tạo biến tĩnh:
<Kiểu dữ liệu><tên lớp>::<tên biến tĩnh>=<giá trị kt>;
• Truy cập biến tĩnh trực tiếp từ lớp hoặc từ đối tượng
52
VÍ DỤ
Định nghĩa lớp Box gồm thông tin về chiều dài, chiều
rộng, chiều cao của một khối hộp và hàm tạo 3 đối số.
Sử dụng biến tĩnh để đếm xem có bao nhiêu đối
tượng được tạo trong chương trình.
Thực hiện khai báo các đối tượng Box, hiển thị giá trị
của biến tĩnh ra màn hình
52
VÍ DỤ
52
Chú ý
Khi đã viết hàm tạo 3 đối số cho lớp Box, khai báo sau sẽ báo lỗi:
52
VÍ DỤ
52
VÍ DỤ
52
HÀM TĨNH
• Hàm thành viên có thể là tĩnh. Đặt từ khóa static trước khai
báo hàm trong lớp
Nếu không truy cập tới dữ liệu đối tượng cần thiết
Và vẫn là thành viên của lớp
- Độc lập với bất kỳ đối tượng cụ thể nào của lớp
- Các hàm static được truy cập chỉ bởi sử dụng tên lớp
hoặc trực tiếp từ lớp trong C++ (giống biến tĩnh).
53
VÍ DỤ VỀ HÀM TĨNH
Định nghĩa lớp Box gồm thông tin về chiều dài, chiều rộng,
chiều cao của một khối hộp và hàm nhập thông tin. Sử dụng
biến tĩnh để đếm xem hàm nhập được gọi bao nhiêu lần. Viết
hàm tĩnh để lấy giá trị của biến tĩnh.
Thực hiện khai báo các đối tượng Box, nhập thông tin cho một
số đối tượng đã khai báo và hiển thị số lần gọi hàm nhập ra
màn hình
52
VÍ DỤ VỀ HÀM TĨNH
53
Ví dụ về hàm tĩnh
53
Ví dụ về hàm tĩnh
Hàm main()
53
BIẾN THÀNH VIÊN KIỂU LỚP
• Cho phép gọi hàm tạo của đối tượng thành viên bên trong hàm tạo
43
Ví dụ về biến thành viên kiểu lớp
52
hw3: Biến thành viên kiểu lớp
Sử dụng lớp môn học đã xây dựng trong hw2. Định nghĩa lớp sinh viên để xây
dựng chương trình nhập thông tin về sinh viên gồm: Họ tên, 3 môn học (tên môn
và số tín chỉ của từng môn).
Hiển thị thông tin ra màn hình dưới dạng bảng như sau. Biết học phí mỗi tín chỉ
là 335.000 VNĐ. Thông tin in ra có dạng:
Sinh vien: Nguyen Van B
So mon hoc: 3
Gom:
52
NỘI DUNG:
❑ Hàm che giấu không cho phép các đối tượng khác truy cập
đến
❑ Hàm được khai báo trong vùng private
❑ Hàm private chỉ gọi được thông qua các hàm khác trong
cùng lớp
❑ Đối tượng trong cùng lớp cũng không truy cập được đến
hàm private khi khai báo ngoài vùng định nghĩa lớp
CSE224 - Lớp và đối tượng 94
Hàm thành phần friend
❑ Hàm friend là hàm được định nghĩa cho phép nhiều lớp cùng sử
dụng chung
❑ Có quyền truy cập đến các thành viên thuộc phạm vi private và
protected
❑ Khai báo: thêm từ khóa friend vào trước kiểu của hàm thành phần
❑ Viết hàm main() nhập vào 2 đối tượng ngày tháng và gọi hàm kiểm
tra để hiển thị thông báo hai ngày đó có trùng nhau hay không.
► 29
Lớp bạn – Ví dụ
► 29