You are on page 1of 84

NGUYÊN LÝ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

CHƯƠNG 2: LỚP VÀ ĐỐI TƯỢNG

Giảng viên: Trần Thị Ngân


Email: ngantt@tlu.edu.vn

1
NỘI DUNG

2.1 Định nghĩa lớp

2.2 Hàm tạo và hàm hủy

2.3 Thành phần tĩnh

2.4 Biến thành viên kiểu lớp

2.5 Hàm bạn và lớp bạn

CSE224 - Lớp và đối tượng 2


ĐỊNH NGHĨA LỚP

• Đị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ế.

• Định nghĩa lớp gồm hai bước:

▪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

CSE224 - Lớp và đối tượng 5


KHAI BÁO LỚP
❑Phương thức: xác định các phương thức hay tác vụ thực hiện xử lý
trên dữ liệu của lớp, được khai báo như khai báo hàm
<kiểu-trả-lại> Tên-phương-thức( ds đối số );
❑Ví dụ:
class date{
….
public:
int get_ngay( );
int get_thang( );
int get_nam( );
int sosanh( date &d );
};

CSE224 - Lớp và đối tượng 6


KHAI BÁO LỚP
❑Dữ liệu: xác định các thành phần dữ liệu để mô tả lớp  gọi là trường,
thuộc tính để xác định đối tượng
▪dữ liệu được mô tả thông qua tên và kiểu xác định  khai báo biến dữ
liệu
▪kiểu: chấp nhận được khai báo các kiểu gồm các kiểu cơ bản(int, float,…)
hay con trỏ đến đối tượng lớp
▪ví dụ:
class date{
private:
int ngay, thang, nam;
….
};

CSE224 - Lớp và đối tượng 7


KHAI BÁO LỚP
▪ví dụ:
class date{
private:
int ngay;
int thang;
int nam;
public:
int get_ngay( );
int get_thang( );
int get_nam( );
int sosanh( date &d );
};

CSE224 - Lớp và đối tượng 8


Ví dụ

Đị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();

CSE224 - Nhắc lại về C++ 9


Định nghĩa hàm thành phần

❑Đị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 bên trong khai báo lớp

CSE224 - Lớp và đối tượng 10


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

CSE224 - Lớp và đối tượng 11


Định nghĩa bên ngoài khai báo lớp
❑Là thực hiện đinh nghĩa bên ngoài vùng khai báo class  định nghĩa
sau dấu “ ; ” của khai báo class
❑ Định nghĩa bên ngoài phải có thêm tiếp đầu ngữ chỉ ra tên lớp chứa
hàm cần định nghĩa.
❑Dạng tổng quát:

Kiểu-trả-lại tên-lớp :: tên-hàm (ds đối số)


{
Định nghĩa nội dung hàm
}

CSE224 - Lớp và đối tượng 12


Định nghĩa trong 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

❑ Thường dùng với các hàm đơn giản và ít dòng lệnh

CSE224 - Lớp và đối tượng 13


Ví dụ

Định nghĩa các hàm thành viên: nhap(), xuat() cho lớp nhân
viên

CSE224 - Nhắc lại về C++ 16


Ví dụ

Định nghĩa các hàm thành viên: nhap(), xuat() cho lớp nhân
viên

CSE224 - Nhắc lại về C++ 17


Tạo lập đối tượng

❑Để 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( );

CSE224 - Lớp và đối tượng 18


Truy cập các thành viên của đối tượng

❑Đố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

CSE224 - Lớp và đối tượng 19


Ví dụ
Cho định nghĩa lớp nhân viên như dưới đây.
Xây dựng hàm main() nhập thông tin cho 2 nhân viên và in
thông tin 2 nhân viên đó ra màn hình.
Kiểm tra xem 2 nhân viên có cùng mã

CSE224 - Nhắc lại về C++ 20


Vai trò 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

• Kiểu dữ liệu bất kỳ bao gồm


Dữ liệu (phạm vi của dữ liệu)
Các thao tác (có thể được thi hành trên dữ liệu)

Ví dụ: kiểu dữ liệu int có


Dữ liệu: +-32,767
Các thao tác: +, -, *, /, %, so sánh, …
• Với lớp: chúng ta chỉ ra dữ liệu, còn các thao tác
phụ thuộc vào dữ liệu
• Đối tượng là đóng gói của giá trị dữ liệu và các
thao tác trên dữ liệu

24
Nguyên tắc lập trình hướng đối tượng

• Ẩn thông tin: người dùng lớp không được biết chi

tiết về các thao tác làm việc như thế nào,

• Trừu tượng dữ liệu: người dùng không được biết

chi tiết về dữ liệu được vận hành như thế nào,

• Đóng gói: Buộc dữ liệu và các thao tác với nhau,

nhưng ẩn đi các chi tiết.


25
Thành viên public và private
• Dữ liệu trong lớp thường được khai báo private
trong định nghĩa
Duy trì các quy tắc của OOP

Ẩn dữ liệu với người dùng

Chỉ cho phép vận hành bởi các thao tác (hàm thành viên)

• Các mục public (thường là các hàm thành viên)


cho phép người dùng truy cập

26
Ví dụ về public và private
• Ví dụ:
class DayOfYear {
public:
void input();
void output();
private:
int month; int day;
};

• Dữ liệu bây giờ là private


• Các đối tượng không thể truy cập trực tiếp
• public thường được đặt trước private

27
Ví dụ public và private

• Khi khai báo đối tượng:


DayOfYear today;
• Đối tượng today chỉ có thể truy cập các hàm
thành viên, không được truy cập vào dữ liệu
cin >> today.month; // Không được phép!
cout << today.day; // Không được phép!

• Thay vào đó phải gọi các thao tác public


today.input();
today.output();

28
Ví dụ so sánh

class DayOfYear class DayOfYear


{
{ public:
public: void output(); void input();
void output();
int month; private:
int day; int month;
int day;
}; };
today.output() today.output()
today.input()
today.month
today.month//không được
today.day today.day //không được
28
Hàm thành viên truy cập và biến đổi

➢ Đối tượng cần làm việc với dữ liệu của nó


➢ Hàm thành viên truy cập (hàm get)
Cho phép đối tượng đọc dữ liệu
Còn được gọi “hàm thành viên get”
Truy hồi dữ liệu thành viên
➢ Hàm thành viên biến đổi (hàm set)
Cho phép đối tượng thay đổi dữ liệu
Thao tác dựa vào ứng dụng

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

Định nghĩa lớp sách gồm các thông tin private: mã


sách, tên sách, số trang, tác giả và các hàm nhập thông
tin và các hàm truy cập, biến đổi cần thiết. Viết chương
trình nhập thông tin của 2 quyển sách (không trùng mã)
và in thông báo xem 2 quyển sách đó có cùng tác giả
hay không

19
Ví dụ áp dụng

Định nghĩa lớp ngày trong năm với thông tin về


ngày, tháng (private) và các hàm nhập, xuất thông
tin và các hàm truy cập cần thiết.
Nhập ngày hiện tại và ngày sinh của 1 người. In
các thông tin đã nhập và hiển thị thông báo chúc
mừng sinh nhật nếu hôm nay là ngày sinh của
người đó.

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.

❑ Ví dụ: Lớp phân số (gồm tử số và mẫu số)

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:

2.1 Định nghĩa lớp


2.2 Hàm tạo và hàm hủy
2.3 Thành phần tĩnh
2.4 Hàm bạn và lớp bạn

CSE224 - Lớp và đối tượng 41


Hàm tạo (Constructor) và Hàm hủy (Destructor)

❑ Là phương thức được định nghĩa đặc biệt được sử


dụng khi khởi tạo một đối tượng mới hay loại bỏ đối
tượng.
▪ Hàm tạo: cho phép tự động tạo ra một đối tượng mới khi
khai báo
▪ Hàm hủy: tự động phá bỏ đối tượng khi không cần dùng
đến

CSE224 - Lớp và đối tượng 42


Hàm tạo (Constructor)
❑Là hàm thành phần đặc biệt của lớp, làm nhiệm vụ tạo lập các đối tượng theo yêu
cầu.
❑Tên Constructor được đặt trùng với tên lớp đang định nghĩa
Ví dụ:
class sophuc
{
private:
double x; //phan thuc
double y; //phan ao
public:
//dinh nghia ham toan tu cho phep tao doi tuong so phuc
sophuc(); //sophuc( void );
sophuc( double a, double b );
void nhap();
void in();
};

CSE224 - Lớp và đối tượng 43


Hàm tạo (Constructor)
➢ Là một hàm thành viên đặc biệt
➢ Khởi tạo các đối tượng và có thể khởi tạo một vài
hoặc tất cả các biến thành viên
➢ Cho phép thực hiện các hành động khác
➢ Được gọi tự động khi khai báo đối tượng
➢ Là một công cụ hữu ích để thiết lập các giá trị
khởi tạo cho các biến thành viên cụ thể.
➢ Là nguyên tắc cơ bản của lập trình hướng đối
tượng
31
Đặc điểm của hàm tạo
❑ Phải khai báo trong vùng public
❑ Tên của constructor phải trùng với tên của lớp

❑ Tự động được thực hiện khi khai báo đối tượng

❑ Một lớp có thể có nhiều hàm tạo

❑ Không có kiểu trả về

❑ 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ở

CSE224 - Lớp và đối tượng 45


Hàm tạo mặc định (Default Constructor )

• Được định nghĩa là hàm tạo không đối


• Nên định nghĩa nó trong mọi trường hợp
• Được khởi tạo tự động nếu không định nghĩa hàm tạo nào
• Không được khởi tạo tự động nếu đã định nghĩa ít nhất một
hàm tạo
• Nếu không có hàm tạo mặc định thì không thể khai báo:
<Tên lớp> <Tên đối tượng>;

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

• Giống như các hàm thành viên khác:


ngay_thang :: ngay_thang (int gt_thang, int gt_ngay)
{
thang = gt_thang;
ngay = gt_ngay;
}

35
Định nghĩa hàm tạo – cách 2

• Một cách định nghĩa khác: gồm 3 khối


ngay_thang :: ngay_thang (int gt_thang, int gt_ngay): thang
(gt_thang), ngay (gt_ngay)
{
}
◦ Khối thứ 3 được gọi là “phần khởi tạo”
◦ Thân hàm để trống

35
Hàm tạo không đối số

• Tránh nhầm lẫn với hàm chuẩn không đối số

• Gọi hàm chuẩn không đối số :


callMyFunction();

• 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ụ:

date1. ngay_thang(7, 4);


// Không hợp lệ!

date2. ngay_thang(5, 5);


// Không hợp lệ!
ngay_thang date1, date2;
//hợp lệ

 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
……
}

CSE224 - Lớp và đối tượng 66


* ví dụ:
class PS
{
public:
PS( PS &x); //Hàm tạo sao chép
void nhap();
void in();
private: int ts, ms;
};
//Định nghĩa hàm tạo sao chép
PS :: PS(const PS &x)
{
ts = x.ts;
ms = x.ms;
}

CSE224 - Lớp và đối tượng 67


Hàm hủy (Destructor)

❑ Là phương thức(method) thực hiện giải phóng bộ nhớ đã


cấp cho đối tượng khi không cần sử dụng đối tượng.

❑ Mỗi lớp chỉ có duy nhất một Destructor

❑ Destructor là một hàm rỗng không có tham số và là hàm


thành phần của lớp có cùng tên lớp và thêm tiếp đầu ngữ
“~”

❑ 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

➢ Sự thi hành của lớp được ẩn đi:


Các định nghĩa hàm thành viên nằm ở chỗ khác

Người dùng không cần thấy chúng

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:

2.1 Định nghĩa lớp

2.2 Hàm tạo và hàm hủy

2.3 Thành phần tĩnh

2.4 Hàm bạn và lớp bạn

CSE224 - Lớp và đối tượng 72


Thành viên tĩnh

• Biến thành viên tĩnh


◦ Tất cả đối tượng của lớp chia sẻ một bản sao

◦ Một đối tượng thay đổi nó -> tất cả đều thấy sự thay đổi

• Sử dụng cho việc “giám sát”


◦ Một hàm thành viên có được gọi thường xuyên không
◦ Có bao nhiêu đối tượng tồn tại ở một thời điểm cho trước

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

Cách 1: <tên lớp>::<tên biến tĩnh>

Cách 2: <tên đối tượng>.<tên biến tĩnh>

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Ụ

Định nghĩa lớp Box:

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:

Nguyên nhân: ???


Khai báo Box A; sẽ gọi hàm tạo mặc định (hoặc hàm tạo không đối). Tuy
nhiên đã có hàm tạo 3 đối số được viết nên hàm tạo mặc định không tồn
tại.

52
VÍ DỤ

Khắc phục: Có thể sử dụng tham số mặc định

52
VÍ DỤ

Khi đó có thể khai báo

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

Làm cho nó trở thành một hàm tĩnh

• Có thể được gọi bên ngoài lớp


Từ các đối tượng không lớp,
Và bởi các đối tượng lớp,

• Hàm tĩnh chỉ có thể sử dụng dữ liệu tĩnh, hàm tĩnh


53
HÀM TĨNH

- Độc lập với bất kỳ đối tượng cụ thể nào của lớp

- Các hàm thành viên static có một phạm vi lớp và chúng


không có sự truy cập tới con trỏ this của lớp trong C++.

- 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

Định nghĩa lớp Box

53
Ví dụ về hàm tĩnh

Khởi tạo biến tĩnh và viết các hàm thành viên

53
Ví dụ về hàm tĩnh

Hàm main()

53
BIẾN THÀNH VIÊN KIỂU LỚP

• Biến thành viên lớp có thể là một đối tượng có kiểu là

một lớp khác

• 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

của lớp phía ngoài

43
Ví dụ về biến thành viên kiểu lớp

Cho khai báo lớp Date


Định nghĩa các hàm thành
viên của các lớp,
Viết hàm main() nhập thông
tin cho đối tượng sinh viên
và in thông tin vừa nhập ra
màn hình

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:

2.1 Định nghĩa lớp

2.2 Hàm tạo và hàm hủy

2.3 Thành phần tĩnh

2.4. Hàm bạn và lớp bạn

CSE224 - Lớp và đối tượng 92


Phân loại hàm thành phần

❑Hàm thành phần của lớp gồm các loại sau:


▪ Hàm thành phần riêng của lớp  được khai báo trong
vùng private
▪ Hàm thành phần tĩnh  được khai báo với từ khóa static
▪ Hàm bạn  được khai báo với từ khóa friend

CSE224 - Lớp và đối tượng 93


Hàm thành phần private

❑ 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

❑ Cú pháp khai báo:

friend <kiểu dl trả về> <tên-hàm> ([danh sách tham số]);

CSE224 - Lớp và đối tượng 95


Hàm thành phần friend

❑ Hàm friend có thể định nghĩa ở mọi nơi và không


cần dùng từ khóa friend hay toán tử ::

 Hàm friend không là hàm thành viên của lớp nên


được định nghĩa như các hàm thông thường

CSE224 - Lớp và đối tượng 96


Đặc điểm hàm friend
❑ Không nằm trong miền xác định của lớp nơi được khai báo
❑ Khi truy cập đến hàm không cần gắn với đối tượng của lớp 
truy nhập đến các hàm friend thực hiện như các hàm khai báo thông
thường
❑ Thông thường đối số của các hàm friend là các đối tượng đang
định nghĩa
❑ Hàm friend không sử dụng con trỏ this
CSE224 - Lớp và đối tượng 97
Ví dụ: hàm friend
❑ Định nghĩa lớp ngày tháng và viết hàm (friend function) kiểm tra xem
hai ngày có trùng nhau không.
class date{
public:
void input();
friend bool is_Equal(const date &d1, const date &d2);
private:
int day, month, year;
};

❑ 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.

CSE224 - Lớp và đối tượng 98


Ví dụ: hàm friend
❑ Định nghĩa lớp với hàm bạn

CSE224 - Lớp và đối tượng 99


Ví dụ: hàm friend
❑ Viết các hàm thành viên và hàm bạn

Thân hàm is_Equal có thể thay bằng lệnh:


return ((d1.day==d2.day)&&(d1.month==d2.month)&& (d1.year==d2.year);

CSE224 - Lớp và đối tượng 100


Ví dụ: hàm friend
❑Hàm main()

CSE224 - Lớp và đối tượng 101


Ví dụ: hàm friend
❑ Định nghĩa lớp số phức bao gồm phần thực và phần ảo,
viết hàm nhập và in thông tin về số phức.
❑ Xây dựng hàm bạn (friend function) tính tổng hai số phức.
❑ Viết hàm main(), nhập vào 2 số phức. In 2 số phức vừa
nhập ra màn hình. Tính tổng và hiển thị kết quả ra màn
hình.

CSE224 - Lớp và đối tượng 102


Lớp bạn (friend classes)

❑Toàn bộ một lớp có thể là bạn của một lớp khác


❑Tương tự như một hàm là bạn trong một lớp
❑Nếu lớp F là bạn của lớp C thì tất cả hàm thành viên của
lớp F đều là bạn của lớp C
❑ Điều ngược lại không đúng
❑ Trong định nghĩa lớp C có thêm khai báo friend class F

► 29
Lớp bạn – Ví dụ

► 29

You might also like