Tải bản đầy đủ (.pdf) (48 trang)

Bài giảng Lập trình hướng đối tượng - Huỳnh Thị Thu Thủy

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (356.01 KB, 48 trang )

5/10/2013

Tài liệu tham khảo
BÀI GiẢNG
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

1. Lập trình hướng đối tượng C++,Trần Văn
Lăng, phân viện Cơ nghệ thô ti

hâ iệ Công hệ thông tin
TPHCM, NXB Thống kê, 1996
2. Giáo trình ngơn ngữ lập trình hướng đối
tượng với C++, Nguyễn Chí Trung, NXB
Hà Nội, 2005

Giảng viên: Huỳnh Thị Thu Thủy
Số tiết lý thuyết: 45
Số tiết thực hành: 30

5/10/2013

• Chương 1: Tổng quan về lập trình hướng đối
tượng.
tượng
• Chương 2: Lớp và thực thể.
• Chương 3: Quá tải hàm.
• Chương 4: Q tải tốn tử.
• Chương 5: Tính thừa kế.
• Chương 6: Hệ thống nhập xuất C++.
C++
• Chương 7: Sự kết nối động.


• Chương 8: Hàm và lớp chung

ThS. Huỳnh Thị Thu Thuỷ

2

Chương 1: Tổng quan về
lập trình hướng đối tượng

Giới thiệu

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

1. Giới thiệu ngôn ngữ C++
2. Lập trình hướng đối tượng là gì
3. Các ngơn ngữ và ứng dụng OOP
4. Sự đóng kín (Encapsulation)
5.
5 Tính đa hình (Polymorphism)
6. Tính thừa kế (Inheritance)
7. Phương thức ảo (Virtual method)
3

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

4


1


5/10/2013

1. Giới thiệu ngôn ngữ C++ (tt)

1. Giới thiệu ngôn ngữ C++
a.
-

b.




Các kiểu dữ liệu cơ bản
Kiểu số nguyên: int
ể ố
Kiểu số thực: float
Kiểu số nguyên dài: long
Kiểu kí tự: char
Kiểu chuỗi: char *

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ






5

1. Giới thiệu ngơn ngữ C++ (tt)
Các vị trí khai báo biến
Bắt đầu của một khối:


-

-

Bên ngoài hàm:

-

VD: int n;
void main() { … }

Đối số hàm:
-

5/10/2013

5/10/2013

<tên biến>;


Biến nguyên a:
int a;
Biến thực x,y:
float x,y;
Biến chuỗi st:
char * st;//cấp phát bộ nhớ
Hoặc
char st[<n>] ; // không cần gọi cấp
(với n nguyên dương) phát bộ nhớ
ThS. Huỳnh Thị Thu Thuỷ

6

1. Giới thiệu ngôn ngữ C++ (tt)
 Khai báo hằng
• Cách 1:
const <tên kiểu> <tên hằng> = <giá trị>;
- Ví dụ:
const float PI=3.1416;
const max=100;//mac nhien int
const char * st=“Tin hoc”;

VD: void main()
{ int n; …. ; float b; }

-

Khai báo dữ liệu
Khai báo biến
Cú pháp: <tên kiểu>

Ví dụ:

VD: long giaithua( int n ) { … }
ThS. Huỳnh Thị Thu Thuỷ

7

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

8

2


5/10/2013

1. Giới thiệu ngơn ngữ C++ (tt)
• Cách 2:
#define #d fi
tê hằng>

1. Giới thiệu ngôn ngữ C++ (tt)
c. Xuất nhập dữ liệu
 Lệnh xuất: Sử dụng toán tử chèn(<<) kết hợp
chèn( )
với luồng xuất cout.
– Cần khai báo file tiêu đề iostream.h

– Ví dụ:

<giá t ị hằng>
iá trị hằ

- Ví dụ:
#define PI
3.1416
#define max 100
#define st
“Tin hoc”





5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

9

1. Giới thiệu ngôn ngữ C++ (tt)
 Lệnh nhập: Sử dụng toán tử chiết (>>)kết
hợp với luồng nhập cin.
– Cần khai báo file tiêu đề iostream.h


– Ví dụ:





5/10/2013

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

10

1. Giới thiệu ngôn ngữ C++ (tt)
d. Cấu trúc điều khiển
 Cấu trúc if
if (<biểu thức điều kiện>)

Nhập số nguyên a:
cin>>a;
Nhập 2 số thực x,y:
cin>>x>>y;
Nhập chuỗi st:
cin>>st; //chuỗi nhập khơng có khoảng trắng
gets(st); // chuỗi nhập có khoảng trắng
file tiêu đề stdio.h
ThS. Huỳnh Thị Thu Thuỷ

In ra màn hình dịng chữ: “Tin hoc”
;
cout<<“Tin hoc”;
In ra màn hình “BORLAND C++”

“VERSION 4.5”
cout<<“BORLAND C++\nVERSION 4.5”
In nội dung 2 biến a,b: cout<
11

{ <công việc 1>; }
else { <công việc 2>; }
 Ý nghĩa: Nếu <biểu thức điều kiện> có giá
trị khác 0 thì thực hiện <công việc 1>
ngược lại thực hiện <công việc 2>.
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

12

3


5/10/2013

1. Giới thiệu ngôn ngữ C++ (tt)

1. Giới thiệu ngôn ngữ C++ (tt)

 Ví dụ 1: Viết CT nhập vào 1 số nguyên dương.
Cho biết số đó là chẵn hay lẻ
lẻ.
#include<iostream.h>

main()
{ int n;
cout<<“nhap so:”; cin>>n;
(
)
if (n>0)
if (n%2 ==0) cout<<“n chan”;
else cout<<“n le”;
else cout<<“khong xet”;
return 0; }

 Ví dụ 2: Viết CT nhập vào 3 số nguyên a,b,c. Cho
biết giá trị số lớn nhất.
g

#include<iostream.h>
main()
{ int a,b,c;
cout<<“nhap 3 so nguyen:”; cin>>a>>b>>c;
if (a>b)
if (a>c) cout<<“so lon nhat la”<cout<< so
la <else cout<<“so lon nhat la”<else if (b>c) cout<<“so lon nhat la”<else cout<<“so lon nhat la”<return 0; }

5/10/2013


5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

13

1. Giới thiệu ngôn ngữ C++ (tt)
 Cấu trúc switch … case
switch (<biểu thức>)
{ case <giá trị 1>: {<công việc 1>; break;}
case <giá trị 2>: <công việc 2>; break;
...
case <giá trị n>: <công việc n>; break;
default:
<công việc n+1>;
}
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

15

ThS. Huỳnh Thị Thu Thuỷ

14

1. Giới thiệu ngơn ngữ C++ (tt)
 Ví dụ: Viết CT nhập một số nguyên từ 1 đến 7.
Cho biết thứ tương ứng với số trong tuần.
#include<iostream.h>

#i l d i t
h
main()
{ int so; cout<<“nhap so:”; cin>>so;
switch(so)
{ case 1: cout<<“Chu nhat”; break;


case 7: cout<<“Thu bay”; break;
default: cout<<“Khong xet”;
}
return 0; }
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

16

4


5/10/2013

1. Giới thiệu ngôn ngữ C++ (tt)

1. Giới thiệu ngôn ngữ C++ (tt)
• Lưu đồ cấu trúc for

Cấu trúc for


Vào

for (<biểu thức 1>; <biểu thức 2>; <biểu thức 3>)
{ <công việc>; }

<Bthức 1>
Sai (=0)

Trong đó:
+ <Biểu thức 1>: câu lệnh khởi tạo giá trị ban đầu cho biến chạy
chạy.

<Bthức 2>
Đúng (0)

+ <Biểu thức 2>: điều kiện để thực hiện công việc của for.
+ <Biểu thức 3>: câu lệnh giúp làm thay đổi giá trị <biểu thức 2>.

<công việc>

<Bthức 3>

Ra
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

17

1. Giới thiệu ngôn ngữ C++ (tt)


5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

18

1. Giới thiệu ngơn ngữ C++ (tt)
Ví dụ 2: Viết CT nhập số nguyên dương n. In

Ví dụ 1: Viết CT in các số từ 1 đến n
#include<iostream.h>
#i l d i
h
main()
{ int n;
cout<<“nhap n:”; cin>>n;
(
)
if (n>0)
for (int i=1; i<=n; i++)
cout<return 0; }
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

ra màn hình số chẵn <=n trên 1 dịng, số lẻ <=n
trên dòng khác
khác.

#include<iostream.h>
void main()
{ int n; cout<<“nhap n:”; cin>>n;
if (n>0)
{ for (int i=2; i<=n; i++)
if (i%2==0) cout<cout<cout<<“\n”;
for (int i=1; i<=n; i++)
if (i%2!=0) cout<else cout<<“Khong xet”; }
19

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

20

5


5/10/2013

1. Giới thiệu ngơn ngữ C++ (tt)
Ví dụ 3: Viết CT nhập số nguyên dương n. In
ra màn hình giá trị 2 luỹ thừa n.

Cấu trúc while


#include<iostream.h>
#include<iostream h>
void main()
{ int n; cout<<“nhap n:”; cin>>n;
float lthua=1;
if (n>0)
for (int i=1; i<=n; i++)
lthua lthua 2;
lthua=lthua*2;
else
for (int i=1; i<=n; i++)
lthua=lthua/2;
cout<<“Kqua:”<5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

1. Giới thiệu ngôn ngữ C++ (tt)
while (<biểu thức>)

{ <công việc>; }
 Ví dụ 1: Đoạn CT in các số từ 1 đến n.
i=1;
while (i n)
(i<=n)
{ cout<i++;
}

21


5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

22

1. Giới thiệu ngôn ngữ C++ (tt)

1. Giới thiệu ngơn ngữ C++ (tt)

 Ví dụ 2: Viết CT nhập số nguyên dương n. In
ra màn hình n số nguyên dương lẻ đầu tiên
tiên.

 Ví dụ 3: Viết CT nhập số nguyên dương n. Cho
#include<iostream.h>
void main()
{ int i, n; cout<<“nhap so nguyen duong:”; cin>>n;
if (n>1)
{ i=2;
while (n % i ! 0) i++
hile
!=0) i++;
if (i==n) cout<else cout<}
else cout<}


#include<iostream.h>
void main()
{ int i, n;
cout<<“nhap so nguyen duong:”; cin>>n;
if (n>0)
{ i 1
i=1;
while (i<=2*n-1)
{ cout<}
}
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

biết n có là số nguyên tố không
không.

23

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

24

6


5/10/2013


1. Giới thiệu ngôn ngữ C++ (tt)

1. Giới thiệu ngôn ngữ C++ (tt)

Cấu trúc do…while

 Ví dụ 2: Viết CT lặp lại nhiều lần việc nhập 1 số
nguyên x. Việc nhập kết thúc khi x=0. Cho biết
có bao nhiêu số âm và số dương đã nhập.

do { <công việc>;
} while (<biểu thức>);
 Ví dụ 1: Đoạn CT kiểm tra việc nhập DTB với
thang điểm 10.
do {
cout<<“nhap DTB:”; cin>>dtb;
} while (dtb<0 ||dtb>10);
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

25

1. Giới thiệu ngôn ngữ C++ (tt)
 Ví dụ 2: Viết CT lặp lại nhiều lần việc nhập 1 số
nguyên x. Việc nhập kết thúc khi x=0. Cho biết
có bao nhiêu số đã nhập.

ThS. Huỳnh Thị Thu Thuỷ


5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

26

1. Giới thiệu ngôn ngữ C++ (tt)
 Ví dụ 3: Viết CT lặp lại nhiều lần việc nhập 1 số
thực x. Việc nhập kết thúc khi khơng muốn nhập
nữa.
nữa Cho biết có bao nhiêu số thực đã nhập
nhập.
#include<iostream.h>
void main()
{ float x; int so=0; char Traloi;
do {
cout<<“nhap so thuc:”; cin>>x;
so++;
cout<<“Nhap so thuc tiep khong (T/K):”;
cin>>Traloi;
} while (Traloi==‘T’ ||Traloi==‘t’ );
cout<<“\n So so thuc da nhap:<}

#include<iostream.h>
void main()
}

5/10/2013


#include<iostream.h>
void main()
{ int x, sd=0, sa=0;
do { cout<<“nhap x:”; cin>>x;
(
)
;
if (x>0) sd++;
else
if (x<0) sa++; } while (x!=0);
cout<<“\n So so duong:<cout<<\n So so am:<
27

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

28

7


5/10/2013

1. Giới thiệu ngơn ngữ C++ (tt)

2- Lập trình hướng đối tượng là gì


e. Xây dựng hàm

• Lập trình hướng đối tượng (Object
Oriented
O i t d programming - OOP) là kh
i
khuynh
h
hướng lập trình lấy đối tượng làm nền
tảng để xây dựng thuật giải xây dựng
chương trình.
• Thực chất đây khơng phải là 1 phương
pháp lập trình mới mà là một cách nhìn
mới trong lập trình.

<kiểu trả về> <tên hàm>(<đối số>)
(
)
{ <các lệnh>
[ return <giá trị trả về>;]
}

 Ví dụ: Khai báo và định nghĩa hàm sau:
Hàm tính n giai thừa:
long gthua(int n)
{ …. }
Hàm nhập dãy n số thực
void nhapday2 (float a[ ], int n)
{ ….. }

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

29

2- Lập trình hướng đối tượng là gì(tt)

CTDL + Thuật giải = Chương trình

30

3- Các ngơn ngữ và ứng dụng OOP

• Trung tâm nghiên cứu Palo Alto của hãng
XEROX đã tập trung 10 năm nghiên cứu để
hồn thiện ngơn ngữ OOP đầu tiên với tên gọi
SMALLTALK.

• Theo lập trình hướng đối tượng
Phương thức + Dữ liệu = Đối tượng

ThS. Huỳnh Thị Thu Thuỷ

ThS. Huỳnh Thị Thu Thuỷ

• Xuất phát từ tư tưởng của ngơn ngữ SIMULA67
(phát triển vào năm 1960)
1960).


• Theo lập trình hướng cấu trúc (thủ tục):

5/10/2013

5/10/2013

• Các ngơn ngữ OOP lần lượt ra đời: EIFFEL,
CLOS, LOOPS, FLAVORS, OBJECT PASCAL,
OBJECT C, C++, DELPHI, JaVa, C#, Java#.
31

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

32

8


5/10/2013

3- Các ngơn ngữ và ứng dụng OOP(tt)
• Chính XEROX, trên cơ sở ngơn ngữ OOP của
mình đã đề ra tư tưởng giao tiếp hình tượng
trên màn hình (
(icon base screen interface).
f
)
• Apple Macintosh, Microsoft Windows phát triển

giao tiếp đồ hoạ như hiện nay.
• Microsoft Windows: ta ln thực hiện cùng một
công việc: “đưa trỏ chuột vào đối tượng rồi nhấn
trái chuột”. Mỗi đối tượng có thể là: Control
Menu, Control Menu Box, Title Bar,…sẽ đáp
ứng công việc tuỳ theo đặc tính của mình.
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

33

4- Sự đóng kín (tt)

ThS. Huỳnh Thị Thu Thuỷ

• Sự đóng kín: Cơ chế liên kết mã và dữ liệu
mà nó thao tác, giữ cho cả 2 được an toàn
khỏi sự can thiệp từ bên ngồi hoặc do sử
dụng sai.

Mã + Dữ liệu
• Trong 1 đối tượng: mã hoặc dữ liệu hoặc cả
2 có thể là của riêng đối tượng đó hoặc
chung.
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

34


5- Tính đa hình (Polymorphism)

• Nếu mã hoặc dữ liệu là riêng thì nó chỉ có thể
được truy cập bởi bộ phận của đối tượng
tượng,
không được truy cập bởi thành phần khác
của chương trình tồn tại ngồi đối tượng.
• Khi mã hoặc dữ liệu là chung, các bộ phận
khác của CT vẫn có thể truy cập được nó.
• Các thành phần chung của đối tượng: cung


cấp 1 giao diện có điều khiển cho các thành
phần riêng của đối tượng.
5/10/2013

4- Sự đóng kín (Encapsulation)

35

• Tính đa hình: Tính chất cho phép 1 tên được
g
y

dùng cho 2 hay nhiều mục đích khác nhau.
• Mục đích của tính đa hình trong OOP: cho
phép 1 tên được dùng để chỉ rõ 1 lớp tác
động tổng quát.
• Trong lớp tác động tổng quát 1 tác động cụ

quát,
thể được xác định bởi loại dữ liệu.
• Ví dụ: Hàm abs(n) trong C++.
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

36

9


5/10/2013

6- Tính thừa kế (Inheritance)

5- Tính đa hình (tt)
• Khái niệm tính đa hình chính là ý tưởng 1
giao diện nhiều phương pháp
pháp.
• Ưu điểm của tính đa hình: giảm tính phức
tạp.

• Tính thừa kế: Q trình 1 đối tượng có thể
có được các tính chất của đối tượng khác.
• Một đối tượng có thể kế thừa các tính chất
tổng quát để bổ sung thêm các đặc điểm
của nó.
Đối tượng A có x,y


• Tính đa hình được áp dụng cho hàm và
toán tử: Quá tải hàm; Quá tải toán tử.

Thừa kế
Đối tượng B có z,t

 B có x,y,z,t
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

37

• Nếu khơng thừa kế, mỗi đối tượng sẽ phải
định hĩ
đị h nghĩa mọi đặ t
i đặc trưng có liê quan đế
ó liên
đến
nó.
• Ví dụ: Đối tượng A có hàm nhap, xuat
Đối tượng B giống đối tượng A có
hàm nhap, xuat và hàm xu ly
xu_ly
• Nếu B khơng thừa kế A: Khi xây dựng B
ta phải xây dựng cả 3 hàm nhap, xuat và
hàm xu_ly
ThS. Huỳnh Thị Thu Thuỷ

ThS. Huỳnh Thị Thu Thuỷ


38

7- Phương thức ảo (Virtual method)

6- Tính thừa kế(tt)

5/10/2013

5/10/2013

39

• Phương thức ảo: Phương thức sẽ mang nội
dung cụ thể vào lúc thực hiện CT.
g
• Khi biên dịch, đoạn CT của phương thức ảo sẽ
được đưa vào bảng các phương thức
ảo(Virtual method table – VMT).
• Khi CT thực hiện, các phương thức ảo sẽ
được gọi từ bảng phương thức ảo này.
• Đây là kỹ thuật kết nối động(dynamic binding)
– kết nối trễ(late binding).
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

40

10



5/10/2013

Bài tập chương 1

Chương 2: Lớp và thực thể

1. Viết chương trình tính n!
2. Viết chương trình tính tổng n số ngun
g
g
g y
dương chẵn đầu tiên.
3. Viết chương trình tính tổng n số nguyên
dương lẻ đầu tiên.
4. Viết chương trình tìm ước số chung lớn
nhất của 2 số nguyên dương m n
m,n.
5. Viết chương trình nhập 1 số nguyên từ 1
đến 12. Cho biết tháng tương ứng với số có
bao nhiêu ngày.
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

41

3.Con trỏ đối tượng
4.Các hàm nội tuyến

5.Gán – Truyền – Trả đối tượng về từ hàm
6.Giới thiệu các hàm friend
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

42

b. Thực thể (Instance) – đối tượng: là biến kiểu
lớp. Muốn sử dụng lớp phải khai báo đối tượng
thuộc lớp.

a. Lớp (class): Thực chất là 1 kiểu dữ liệu
được định nghĩa trong CT.



• Lớp gồm 2 thành phần: Dữ liệu và
phương thức.
• Các thành phần của lớp có thể có 1 trong
3 thuộc tính:
 private
 protected
 public
ThS. Huỳnh Thị Thu Thuỷ

2.Hàm tạo – Hàm huỷ

1- Lớp và thực thể(tt)


1- Lớp và thực thể

5/10/2013

1.Lớp và thực thể

43



Định nghĩa lớp:
class <tên lớp>
{ // dữ liệu
//phương thức, hàm thành phần
};
Định
Đị h nghĩa phương thức ngoài khai báo lớp
hĩ h
thứ
ài kh i bá lớ
<kiểu trả về> <tên lớp>::<tên hàm>(đối số)
{ //thân hàm
[ return <giá trị trả về>;]
}

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

44


11


5/10/2013

1- Lớp và thực thể(tt)

1- Lớp và thực thể(tt)
• Ví dụ 2: Lớp sample có 2 vùng dữ liệu nguyên.
Các phương thức: nhap, xuat.



Khai báo đối tượng thuộc lớp:
<tên lớp> <tên đối tượng>;



Ví dụ 1: Lớp sample có 1 vùng dữ liệu nguyên.
Các phương thức: nhap, xuat.
class sample
{ int a;
public:
void nhap() { cou
o d ap() cout<<“nhap a ; c
ap a:”; cin>>a; }
a;
void xuat() { cout<<“a=“<};

void main()
{ sample ob; ob.nhap(); ob.xuat();}

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

45

2- Hàm tạo – Hàm huỷ



Phương thức thiết lập(PTTL) là phương thức
ế
đặc biệt của lớp nhằm thực hiện các công việc
ban đầu như: cấp phát vùng nhớ, khởi tạo giá
trị ban đầu, mở tập tin…



Ví dụ1:
class sample { int a;
public: sample(){a=0; cout<<“constructor”;}
…..
};
ThS. Huỳnh Thị Thu Thuỷ

5/10/2013


ThS. Huỳnh Thị Thu Thuỷ

46

2- Hàm tạo – Hàm huỷ(tt)

a. Hàm tạo - Phương thức thiết lập(Constructor)

5/10/2013

class sample
{ int a, b;
public:
void nhap();
void xuat();
};
void sample:: nhap() { cout<< nhap a b:”; cin>>a>>b; }
cout<<“nhap a,b: ;
void sample::xuat() { cout<<“a=”<void main()
{ sample ob; ob.nhap(); ob.xuat(); }
• Ví dụ 3: Xây dựng lớp TOADO.

47

• Ví dụ 2:
class sample
{ i t a, b
int b; public:
bli

sample(){a=b=0; cout<<“constructor”;}
sample(int x){a=b=x; cout<<“constructor”;}
sample(int x, int y) {a=x; b=y;
cout<<“constructor”;}
;}
nhap() { cout<<“nhap a,b:”; cin>>a>>b; }
void xuat() { cout<<“a=”<};
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

48

12


5/10/2013

2- Hàm tạo – Hàm huỷ(tt)

2- Hàm tạo – Hàm huỷ(tt)

• Đặc điểm của PTTL:
– PTTL có tên trùng tên lớp
g
p
– Khơng có giá trị trả về
– Có thể có 1 hoặc nhiều tham số hoặc khơng có
tham số nào.

– Một lớp có thể khơng có, hoặc có 1 hoặc nhiều

PTTL
– PTTL được tự động gọi khi khai báo đối tượng
thuộc lớp.
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

49

• Đặc điểm của PTHB:

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

50

• Truy các thành viên của đối tượng: dùng tốn
tử chấm điểm (.).
()

– PTHB có tên trùng tên lớp và có dấu


• Dùng tốn tử -> để truy cập thành viên của
đối tượng: cần khai báo con trỏ đối tượng.

– Khơng có giá trị trả về

– Khơng có tham số nào.

• Cú pháp:

– Một lớp có thể khơng có, hoặc có 1 PTHB

– PTHB được tự động gọi khi kết thúc sự tồn tại
của đối tượng thuộc lớp.
ThS. Huỳnh Thị Thu Thuỷ

class sample
{ int a;
public:
sample() {cout<<“\n Constructor”;} //PTTL
~ sample() {cout<<“\n Destructor”;} //PTHB
};

3- Con trỏ đối tượng

2- Hàm tạo – Hàm huỷ(tt)

5/10/2013

• Hàm huỷ - Phương thức huỷ bỏ (Destructor)
• Phương thức huỷ bỏ (PTHB) là phương thức
đặc biệt của lớp nhằm thực hiện các công việc
như: thu hồi vùng nhớ, đóng tập tin đã mở.
• Ví dụ:

51


• VD:

5/10/2013

<tên lớp> *<tên đối tượng>;

sample *ob1, ob2;
ob1=&ob2;
ob1->xuat();
ThS. Huỳnh Thị Thu Thuỷ

52

13


5/10/2013

4- Các hàm nội tuyến

4- Các hàm nội tuyến(tt)

a. Hàm nội tuyến

 Ưu điểm của hàm nội tuyến: Khơng có
các thủ tục bổ sung kết hợp với gọi hàm
và cơ chế trả về.

-


Khai báo hàm nội tuyến: Đặt trước định
nghĩa hàm chỉ định inline.

-

Hàm nội tuyến thi hành nhanh hơn các
g
g
hàm thông thường.

-

Hàm ngắn khai báo nội tuyến.

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

 Tuỳ vào trình biên dịch, có nhiều hạn chế
áp dụng cho hàm nội tuyến.
 Nếu 1 hạn chế nội tuyến bị vi phạm, trình
biên dịch sẽ tạo ra 1 hàm bình thường.
53

4- Các hàm nội tuyến(tt)

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ


54

4- Các hàm nội tuyến(tt)
 Ví dụ:

 Những qui định về nội tuyến:

class sample
{ int a,b;
public:
sample(int x, int y);
long square();
};
inline sample::sample(int x, int y) { a=x; b=y;}
inline long sample::square() { return a*a+b*b;
}

 Hàm khơng có cấu trúc lặp
 Khơng có lệnh nhảy goto
 Khơng có lệnh gọi đệ quy

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

55

5/10/2013


ThS. Huỳnh Thị Thu Thuỷ

56

14


5/10/2013

5- Gán – Truyền – Trả đối
tượng về từ hàm(tt)

5- Gán – Truyền – Trả đối
tượng về từ hàm

• Ví dụ:

• Các đối tượng có thể được sử dụng
ợ g

ụ g
tương tự các biến kiểu bất kỳ.
• Có thể thực hiện gán các đối tượng cùng
kiểu mà vùng dữ liệu của nó thuộc kiểu có
thể thực hiện được p p tốn g


ợ phép
gán.
• Đối tượng có thể: đối số hàm, kết quả trả

về của 1 hàm
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

57

• Một hàm nếu không là hàm thành viên của lớp
sẽ khơng truy cập được các thành phần riêng
của lớp.
• Một loại hàm trong C++ hỗ trợ truy cập được
các thành phần riêng của lớp: hàm friend.
• Hàm friend khơng là hàm thành phần của lớp.
• Hàm friend được định nghĩa giống hàm bình
thường nhưng phần khai báo bên trong lớp có
từ khố friend.
ThS. Huỳnh Thị Thu Thuỷ

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

58

6- Giới thiệu các hàm friend(tt)

6- Giới thiệu các hàm friend

5/10/2013


class Toado
{ int x, y; public:
void nhap() { cin>>x>>y; }
void xuat() {cout<<“(“<Toado cong(Toado ob1, Toado ob2)
{ Toado tempt;
void main()
tempt.x=ob1.x+ob2.x;
tempt x=ob1 x+ob2 x; {Toado b1,ob2,ob3;
tempt.y=ob1.y+ob2.y;
ob1.nhap();ob2.nhap();
return tempt ;
ob3=ob3.cong(ob1,ob2);
}
ob3.xuat(); }
};

59

• Ví dụ 1: Hàm friend của 1 lớp
void main()
()

class myclass
l
l
{ myclass ob(4), ob(6);
cout<{ int a;
cout<

public:
ob1.show();
myclass() { a=0; }
cout<<“\n”;
myclass(int x) { a=x; }
ob2.show();
}
void show() { cout<id h ()
t
friend long sqr(myclass ob);
};
long sqr(myclass ob) { return ob.a*ob.a; }
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

60

15


5/10/2013

6- Giới thiệu các hàm friend(tt)
• Ví dụ 2: Hàm friend của nhiều hơn 1 lớp

• Ví dụ 2: Hàm friend của nhiều hơn 1 lớp(tt)

class struck;

class car
{ int num, speed;
public:
void get(int a, int b) { num=a;speed=b; }
void put() { cout<<“num:”<cout<<“speed:”<friend int greater(car ob1, struck ob2); };
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

6- Giới thiệu các hàm friend(tt)
class struck
str ck
{ int num, speed;
public:
void get(int a, int b) { num=a;speed=b; }
void put() { cout<<“num:”<p ()
;
cout<<“speed:”<friend int greater(car ob1, struck ob2);
};

61

5/10/2013

1. Xây dựng lớp SOPHUC gồm 2 vùng dữ liệu:
thực, ảo. Các phương thức Nhap, Xuat. Viết

hàm main minh họa.
2. Xây dựng lớp HOCSINH gồm các vùng dữ
liệu: Mã số (4 kí tự), Họ tên, DTB. Các
phương thức Nhap (để nhập thông tin của

)
g
(in
g
học sinh). Phương thức Xuat ( thông tin
của học sinh trên 1 dịng). Viết chương trình
nhập danh sách N học sinh. In danh sách N
học sinh ra màn hình.

• Ví dụ 2: Hàm friend của nhiều hơn 1 lớp(tt)
int greater(car ob1, struck ob2)
{ if (ob1.speed >ob2.speed) return 1;
else return 0;
}
void main()
{ car ob1; struck ob2; ob1 input(); ob2 input();
ob1.input(); ob2.input();
if (greater(ob1,ob2)) cout<<“car is greater than
struck”;
else cout<<“struck is greater than or equal to car”;
}
ThS. Huỳnh Thị Thu Thuỷ

62


Bài tập chương 2

6- Giới thiệu các hàm friend(tt)

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

63

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

64

16


5/10/2013

Bài tập chương 2(tt)

Chương 3: Quá tải hàm

3. Xây dựng lớp PHANSO gồm 2 vùng dữ liệu:
tử và mẫu. Các phương thức: Nhập, Xuất để
nhập xuất dữ liệu phân số. Phương thức



cộng, trừ để cộng trừ 2 phân số. Phương
thức tối giản để tối giản 1 phân số. Viết hàm
main minh họa.
4. Xây dựng lớp HINHCHUNHAT gồm 2 vùng
dữ liệu: Chiều dài, chiều rộng. Phương thức:


Nhập để nhập giá trị chiều dài, chiều rộng.
Phương thức Xuất để vẽ hình chữ nhật bằng
các dấu *. Viết hàm main.
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

65

• Sử dụng các đối số mặc định.
• Sự quá tải và tính khơng xác định.

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

66

2- Sử dụng các đối số mặc định

1- Quá tải hàm tạo

• Ví dụ:


• Ví dụ:
class toado
{ int x, y;
pubic: void xuat() {cout<<"("<toado() { x=y=0; }
toado(int a) { x=y=a; }
toado(int a, int b) { x=a; y=b; }
};
void main()
{ toado ob1,ob2(5),ob3(6,7);
ob1.xuat(); ob2.xuat();ob3.xuat(); }
5/10/2013

• Quá tải hàm tạo
tạo.

ThS. Huỳnh Thị Thu Thuỷ

67

class toado
{ int x, y;
pubic: void xuat() {cout<<"("<toado(int a=0, int b=0) { x=a; y=b; }
};
void main()
{ toado ob1,ob2(5),ob3(6,7);
ob1.xuat(); ob2.xuat();ob3.xuat();
}

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

68

17


5/10/2013

3- Sự q tải và tính khơng xác định

• Kiểu dữ liệu
• Ví dụ 2:


• Khi có dùng đối số mặc định
• Ví dụ 1:

float f1(float a) { a++; return a;}
double f1(double a) { a++; return a;}

class toado
{ int x, y;
pubic: void xuat() {cout<<"("<toado() { x=y=0; }
toado(int a) { x=a; y=0; }
toado(int a=0, int b=0) { x=a; y=b; }
a=0

};
void main()
{
toado ob1,ob2(5),ob3(6,7);
5/10/2013

void main()
{

double y=12.34;
cout<
cout<}
69

3- Sự q tải và tính khơng xác định(tt)
• Ví dụ 3:

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

70

3- Sự q tải và tính khơng xác định(tt)
• Tham chiếu
• Ví dụ 4:



void xuat(char c)
(
)

long tong(int a, int b)
{ return a+b; }
long tong(int a, int &b)
{ return a+b; }
void main()
{ int a=4, b=6;
cout<}

{ cout<void xuat(unsigned char c)
{ cout<void main()
id
i ()
{ xuat(‘A’);
xuat(65); / *ambiguity */
5/10/2013

float x=12.34;
cout<
}

ThS. Huỳnh Thị Thu Thuỷ


3- Sự q tải và tính khơng xác định(tt)

ThS. Huỳnh Thị Thu Thuỷ

}
71

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

72

18


5/10/2013

Bài tập chương 3

Bài tập chương 3(tt)

1. Xây dựng lớp SOPHUC gồm 2 vùng dữ liệu:
thực, ảo. Các phương thức:

2. Xây dựng lớp HINHCHUNHAT gồm 2 vùng
dữ liệu: chiều dài, chiều rộng. Các phương
thức:

• PTTL khơng đối số: khởi tạo giá trị 0 cho 2

vùng dữ liệu.
• PTTL 1 đối số: khởi tạo giá trị cho 2 vùng dữ
liệu là giá trị của đối số.
ạ giá ị
g
• PTTL 2 đối số: khởi tạo g trị cho 2 vùng dữ
liệu là giá trị tương ứng của 2 đối ơ1.
• Xuất: In ra màn hình giá trị thực ảo theo dạng
số phức.
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

73

Bài tập chương 3(tt)





5/10/2013

PTTL khơng đối số: khởi tạo giá trị 0 cho 2
vùng dữ liệu.
PTTL 1 đối số: khởi tạo giá trị cho 2 vùng dữ
liệu là giá trị của đối số.
PTTL 2 đối số: khởi tạo giá trị cho 2 vùng dữ
liệu là giá trị tương ứng của 2 đối ơ1.
Xuất: Vẽ hình chữ nhật bằng dấu *.

ThS. Huỳnh Thị Thu Thuỷ

74

Chương 4: Quá tải toán tử

3. Xây dựng hàm hoán vị để hoán đổi nội
dung của 2 số nguyên, 2 số thực và 2 số
nguyên

1. Toán tử đơn nguyên
g y

nguyên dài. Viết hàm main minh họa.

2. Toán tử nhị nguyên

4. Xây dựng hàm nhập để nhập giá trị n phần

3. Toán tử quan hệ luận lý

tử nguyên, n phần tử thực. Xây dựng hàm
xuất để in ra màn hì h giá t ị các phần tử
ất
i
à hình iá trị á hầ
của mảng n số nguyên, n số thực. Viết hàm
main minh họa.
5/10/2013


ThS. Huỳnh Thị Thu Thuỷ

75

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

76

19


5/10/2013

1- Tốn tử đơn ngun

1- Tốn tử đơn ngun(tt)

• Dùng hàm friend:

• Dùng hàm thành phần:

friend void operator<tốntử>(<tên lớp> &<tên đối tượng>)
{ //thân hàm
}

• Ví dụ: class toado

<tên lớp> operator<tốntử>()

{ // thân hàm
return *this; }

• Ví dụ: class toado
{ int x,y; public:
void nhap(){cout<<"nhap x,y:"; cin>>x>>y;}
p(){
p ,y ;
y;}
void xuat(){cout<<"("<toado operator++()
{ this->x++; this->y++;
return *this; }
};

{ int x,y; public:
void nhap(){cout<< nhap x y:"; cin>>x>>y;}
nhap(){cout<<"nhap x,y: ;
void xuat(){cout<<"("<friend void operator++(toado &ob)
{ ob.x++; ob.y++; }
};
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

77

2- Tốn tử nhị ngun


78

• Dùng hàm thành phần:

friend <tên lớp> operator#(<tên lớp> <tên đối tượng 1>,
<tên lớ > <tê lớp> tượng 2>)
{ //thân hàm
return <kết quả>;
}

<tên lớp> operator#(<tên lớp> <tên đối tượng> )
{ //thâ hàm
//thân hà
return <kết quả>;
}

• Ví dụ:

• Ví dụ:

toado operator+(toado ob2)
{ toado tam;
tam.x = x + ob2.x;
tam.y = y + ob2.y;
return tam; }

friend toado operator+(toado ob1, toado ob2)
{ toado tam;

tam.x = ob1.x + ob2.x;
tam.y = ob1.y + ob2.y;
return tam; }
ThS. Huỳnh Thị Thu Thuỷ

ThS. Huỳnh Thị Thu Thuỷ

2- Toán tử nhị nguyên(tt)

• Dùng hàm friend:

5/10/2013

5/10/2013

79

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

80

20


5/10/2013

3- Toán tử quan hệ luận lý


3- Toán tử quan hệ luận lý(tt)

• Dùng hàm friend:

• Dùng hàm thành phần:

friend int operator#(<tên lớp> <tên đối tượng 1>,
<tên lớp> <tên đối tượng 2>)
{ /* thân hàm */ }

• Ví dụ:

}
ThS. Huỳnh Thị Thu Thuỷ

• Ví dụ:
int operator<(toado ob2)
{ int k;
if ( x < ob2.x && y < ob2.y ) k 1
b2
b2
k=1;
else k=0;
return k;
}

friend int operator<(toado ob1, toado ob2)
{
return ob1.x// return 0;

5/10/2013

int operator#(<tên lớp> <tên đối tượng>)
p
(
p
ợ g )
{ /* thân hàm */ }

81

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

82

Bài tập chương 4

Bài tập chương 4(tt)

1. Quá tải toán tử +, - cho lớp SOPHUC để
g
thực hiện việc cộng, trừ 2 số phức. Quá
tải toán tử ++ để tăng giá trị phần thực
và phần ảo lên 1 đơn vị.
2. Quá tải toán tử +, - cho lớp PHANSO để
thực hiện việc cộng, trừ 2 phân số. Quá
tải toán tử ++ để tăng giá trị phân số lên
1 đơn vị.


3. Quá tải toán tử +, - cho lớp TOADO để
g
thực hiện việc cộng, trừ 2 toạ độ. Quá tải
toán tử ++ để tăng giá trị tọa độ x và y
lên 1 đơn vị.
4. Quá tải toán tử ++ cho lớp
HINHCHUNHAT để thực hiện việc tăng
chiều dài và chiều rộng của hình chữ
nhật lên 1 đơn vị.

5/10/2013

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

83

ThS. Huỳnh Thị Thu Thuỷ

84

21


5/10/2013

1- Điều khiển truy cập lớp cơ sở


Chương 5: Tính thừa kế

1. Dạng tổng quát:

1. Điều khiển truy cập lớp cơ sở

3. Hàm tạo – Hàm hủy và tính kế thừa

class <tên lớp thừa kế> : access <tên lớp cơ sở>
{
// thân lớp
};

4. Tính đa thừa kế

access:

2. Sử dụng các thành viên được bảo vệ

5. Các lớp cơ sở ảo

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

85

1- Điều khiển truy cập lớp cơ sở(tt)
Ví dụ 1:
class base

{ int x;
public:
void setx ( int a ) { x=a; }
void showx () { cout<};
p
class derived : public base
{ int y; public:
void sety ( int a ) { y=a; }
void showy () { cout<};
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

main()
{ derived
ob;
ob.setx(10);
ob.sety(20);
ob.showx();
ob.showy();
return 0;
}

87

5/10/2013

private

protected
public
ThS. Huỳnh Thị Thu Thuỷ

86

1- Điều khiển truy cập lớp cơ sở(tt)
Ví dụ 2: Tìm và sửa lỗi chương trình sau
(khơng thay đổi thuộc tính thừa kế):
class base
{ int x;
public:
void setx ( int a ) { x=a; }
void showx () { cout<};
class derived : private base
{ int y;
public:
void sety ( int a ) { y=a; }
void showy () { cout<};
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

main()
{ derived ob;
ob.setx(10);
ob.sety(20);
ob.showx();

y();
ob.showy();
return 0;
}

88

22


5/10/2013

2- Sử dụng các thành viên được bảo vệ

2- Ví dụ 1:

1.Thuộc tính protected:
- Khi các thành phần thuộc lớp cơ sở có
thuộc tính riêng (private), lớp dẫn xuất
khơng truy cập được các thành phần này.
- Để lớp dẫn xuất truy cập được những
thành phần này mà vẫn đảm bảo tính đóng
kín thì phải khai báo chúng có thuộc tính
bảo vệ (protected).
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

89


2- Sử dụng các thành viên được bảo vệ(tt)

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

90

2- Sử dụng các thành viên được bảo vệ(tt)

class base
{ protected:
int a, b;
public:
void setab ( int x, int y ) { a=x ; b=y ; }
void getab ( int &x, int &y ) { x=a ; y=b ; }
class derived: protected base
{ int c;
public:
void setc( int x) { c=x ;}
void getc( int &x) { x=c ;}
void show(){ cout<};

main()
{ derived ob;
ob.setab(1,2);
ob.setc(3);
ob.show();
ob show();

return 0;
}
ThS. Huỳnh Thị Thu Thuỷ

class base
{ protected:
int a, b;
public:
void setab ( int x, int y ) { a=x ; b=y ; }
void getab ( int &x, int &y ) { x=a ; y=b ; }
};
class derived: public base
{ int c; public:
void setc( int x) { c=x ;}
void getc( int &x) { x=c ;}
void show(){ cout<};

Ví dụ 2: Tìm và sửa lỗi chương trình sau (khơng thay
đổi thuộc tính thừa kế):

Hàm main của ví dụ 1

5/10/2013

2- Sử dụng các thành viên được bảo vệ(tt)

91

5/10/2013


ThS. Huỳnh Thị Thu Thuỷ

};

92

23


5/10/2013

2- Sử dụng các thành viên được bảo vệ(tt)
Hàm main của ví dụ 2:

- Khi lớp cơ sở và lớp dẫn xuất có các hàm
p
p
tạo, hàm hủy thì các hàm tạo được thi hành
theo thứ tự dẫn xuất; các hàm hủy được thi
hành theo thứ tự ngược lại.
- Khi lớp cơ sở có phương thức thiết lập
được truyền đối số thì bắt buộc lớp dẫn xuất
phải có xây dựng phương thức thiết lập được
truyền đối số để truyền giá trị cho những đối số
của phương thức thiết lập thuộc lớp cơ sở.

main()
{ derived ob;
ob.setab(1,2);

ob.setc(3);
ob.show();
ob show();
return 0;
}
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

93

3- Hàm tạo – Hàm hủy – Tính kế thừa

derived_constructor (arg_list) : base (arg_list)
{
//body of derived class constructor
}

ThS. Huỳnh Thị Thu Thuỷ

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

94

3- Hàm tạo – Hàm hủy – Tính kế thừa

- Cú pháp truyền đối số từ lớp dẫn xuất đến
lớp cơ sở như sau:


5/10/2013

3- Hàm tạo – Hàm hủy – Tính kế thừa

95

• Ví dụ 1:
class base
{ public:
base() { cout<<”Base Constructor \n”; }
~base(){ cout<<”Base Destructor \n” ; } };
class derived: public base
{ public:
derived(){ cout<<”Drived Constructor \n”; }
~derived(){ cout<<”Drived Desstructor \n”; }
};
5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

96

24


5/10/2013

3- Hàm tạo – Hàm hủy – Tính kế thừa


3- Hàm tạo – Hàm hủy – Tính kế thừa
• Ví dụ 2:

• Hàm main của ví dụ 1:

class base
{ public:
base() { cout<<”Base Constructor \n”; }
~base(){ cout<<”Base Destructor \n” ; }
};
class derived: public base
{ int a;
public:
derived( int x){ cout<<”Drived Constructor \n”; a=x; }
~derived(){ cout<<”Drived Desstructor \n”; }
void show() { cout<};

main()
{
derived ob;
return 0;
}

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

97


3- Hàm tạo – Hàm hủy – Tính kế thừa

98

• Ví dụ 3:
class base
{ int a;
public:
base(int a) { cout<<”Base Constructor \n”; this->a =a ; }
void show() { cout<~base(){ cout<<”Base Destructor \n” ; }
};
class derived: public base
{ public:
derived( int x):base(x) { cout<<”Drived Constructor \n”; }
~derived(){ cout<<”Drived Desstructor \n”; }
};

main()
{
derived ob (9);
ob.show();
return 0;
}

ThS. Huỳnh Thị Thu Thuỷ

ThS. Huỳnh Thị Thu Thuỷ

3- Hàm tạo – Hàm hủy – Tính kế thừa


• Hàm main của ví dụ 2:

5/10/2013

5/10/2013

99

5/10/2013

ThS. Huỳnh Thị Thu Thuỷ

100

25


×