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
Lă
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
có
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
có
– 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