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

CHƯƠNG 3 CÁCH THỨC XÂY DỰNG LỚP pdf

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 (464.13 KB, 12 trang )

14/04/2010
1
CHƯƠNG 3
CÁCH THỨC XÂY DỰNG LỚP
1
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
MỤC TIÊU
y Xây dựng lớp cơ bản dùng C/C++
y Phân biệt được public, private
y Cách viết chương trình chính sử dụng lớp, cách truy
cập đến thành viên của lớp
2
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
NỘI DUNG CHI TIẾT
y LỚP (CLASS) VÀ ĐỐI TƯỢNG (OBJECT)
y HIỆN THỰC LỚP TRONG C++
{ KHAI BÁO LỚP
{ HiỆN THỰC HÀNH VI
HOÀN THI

N L

P
3
{
HOÀN THI

N L


P
y SO VỚI STRUCT TRONG C++
y THUỘC TÍNH TRUY CẬP
y LOẠI HÀNH VI CỦA LỚP
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
4
LỚP LÀ GÌ ?
y Khi một số các đối tượng cùng tính chất được nhóm
lại, tạo nên lớp
girl
class
object
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
Lan
Cúc Trúc
Mai
GV: Võ Hồng Bảo Châu
14/04/2010
2
5
Như vậy,
y Lớp được dùng để mô tả tất cả các đối tượng có hành
vi và dữ liệu tương tự nhau.
y Một lớp là một mẫu (template) hay một khuôn dạng
(mold) để từ đó có thể tạo ra những đối tượng mới.


OOP-CHƯƠNG 3-XÂY DỰNG LỚP
y Có th


xem l

p
như một dạn
g
đ

i tư

n
g
(ob
j
ect's

type)
y Hay kiểu dữ liệu (data type)
Lớp là sự biểu diễn của một mẫu các đối
tượng và mô tả cách mà những đối tượng này
được cấu tạo bên trong
GV: Võ Hồng Bảo Châu
6
HIỆN THỰC LỚP TRONG C++
class NAME{
//members
};
y Như vậy, lớp được bao bọc bởi từ khóa class ở bên
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
n

g
oài.
y Bên trong là các thành phần, bao gồm dữ liệu và
hành vi.
GV: Võ Hồng Bảo Châu
7
KHAI BÁO CLASS
class ClassName [: [<public|private>] <FatherClassName,]
{ public :
< data >
<method>
private :
< data >
•Chương này tạm không đề cập đến đặc tính thừa kế
-Có chương riêng về tính thừa kế.
•Các thuộc tính truy cập: public, private, protected:

< data >
< method>
protected :
< data >
<method>
} ; // có ký tự ‘;’
từ khóa chỉ
đ
ịnh
đ
ặc tính của từn
g
thành

p
h

n n
g
a
y

sau chỉ thị này. Mặc định là private.
• public: cho phép bên ngoài truy cập Æ interface
của lớp.
• private: các thành phần nội, không cho phép bên
ngoài truy cập.
•protected: các thành phần dành cho lớp thừa kế
truy cập, không cho phép các đối tượng không phải
là con truy cập.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
8
HIỆN THỰC HÀNH VI CHO CLASS
y Hiện thực bên trong class – Các hành vi inline
Æ Không dùng các phát biểu continue , do , for , goto ,
switch , case , break , while.
Cú pháp:
DataType MethodName (Parameters)
{ <code>
{ <code>
}
y Hiện thực bên ngoài class
DataType ClassName::MethodName (Parameters)

{ <code>
}
y Toán tử :: là toán tử xác định tầm vực của method (scope
resolution operator)
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
14/04/2010
3
9
VÍ DỤ
OK
Khi hiện thực method bên ngoài class, KHÔNG khai báo lại
access-specifier.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
10
SO VỚI STRUCT TRONG C/C++
y class có thêm các hàm chứa bên trong
y Các hàm phải chỉ định thêm thuộc tính truy cập
(access attributes), chẳng hạn
{ public
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
{ private
{ protected
y Các dữ liệu thành viên cũng phải có thuộc tính truy
cập
GV: Võ Hồng Bảo Châu
11
SO VỚI STRUCT TRONG C/C++
y Chẳng hạn,

struct PERSON{
char name[40];
int birthYear;
};
y Tương đương với
class PERSON{
public:
char name[40];
int birthYear;
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
};
int birthYear;
};
Khi đó mới có thể truy cập được name, birthYear
như đã làm trong kiểu struct.
GV: Võ Hồng Bảo Châu
SO VỚI STRUCT TRONG C/C++
12
struct StructName
{
<data>
};
class ClassName
{
<data>
Modifier
:
Type1 Func1 ()
public
private

protected
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
};
Type1 Func1 (StructName stru)
{ <code>}
Type2 Func2 (StructName stru)
{<code>}
các hàm đều toàn cục
Modifier
:
Type1 Func1 ()
{ <code>}
Modifier : Type2 Func2 ()
{ <code>}
};
Chỉ có method public là toàn cục
GV: Võ Hồng Bảo Châu
14/04/2010
4
13
HOÀN THIỆN LỚP
y Lớp PERSON ở trên mới chỉ mang tính mô tả, chưa sử
dụng được
y Để hoàn thiện, có 2 cách viết khác nhau
{ Đơn giản
h
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
{ P
h


c t

p
GV: Võ Hồng Bảo Châu
14
Cách đơn giản
class PERSON{
char name[40];
int birthYear;
public:
void getData(){
cout << "Name: ";
cin.
g
etline(name, 39);
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
g
cout << "Year of birth: ";
cin >> birthYear;
}
int age(){
cout << name << " is " << 2008 – birthYear
<< " years old\n"
}
};
GV: Võ Hồng Bảo Châu
15
Phức tạp và chuyên nghiệp hơn
class PERSON{
char name[40];

int birthYear;
public:
void getData();
int age();
};
void PERSON::getData(){
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
void PERSON::getData(){
cout << "Name: ";
cin.getline(name, 39);
cout << "Year of birth: ";
cin >> birthYear;
}
int PERSON::age(){
cout << name << " is " << 2008 – birthYear << " years
old\n"
}
GV: Võ Hồng Bảo Châu
16
Lưu ý,
y Trong lớp PERSON cũng có một vài điều nho nhỏ cần
quan tâm về việc dùng ngôn ngữ C++.
{ Do phép toán trích (>>) chỉ nhận chuỗi ký tự không chứa ký tự
blank (space, tab, new line), nên phải dùng hàm getline().
{
Hàm
getline()
có trong l

p ch


a đ

i t
ượ
ng
cin
.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
{
Hàm
getline()
có trong l

p ch

a đ

i t
ượ
ng
cin
.
GV: Võ Hồng Bảo Châu
14/04/2010
5
17
Ví dụ
#include <iostream.h>
main() {

char name[4][40];
int n = 0;
cout <<
"
Name of people loved me
\
n
"
;
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
cout << Name of people loved me
\
n;
while(cin.getline(name[n++],40));
n;
cout << "They are as follow\n";
for ( int i = 0; i < n; i++ )
cout << name[i] << "\n"; return 1;
}
GV: Võ Hồng Bảo Châu
18
TẠO ĐỐI TƯỢNG
y Sau khi có lớp, có thể tạo đối tượng bằng cách khai
báo biến thuộc kiểu lớp
PERSON a, b;
y a, b là 2 đối tượng.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
y Khi đó a và b có thể coi là 2 instance (là ví dụ, là
trường hợp, là cái có thực) của lớp PERSON.
GV: Võ Hồng Bảo Châu

19
y Trong ví dụ trên, có thể tạo các đối tượng như sau:
main(){
PERSON a;
a.
g
etData
();
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
g ();
a.age()
}
GV: Võ Hồng Bảo Châu
20
THUỘC TÍNH TRUY CẬP LÀ GÌ ?
y Hay còn gọi hình thức truy cập, hay tầm nhìn.
y Có 3 thuộc tính, nhằm để quy định khả năng truy cập
đến các thành viên của lớp, có "trông thấy" được
thành viên nào đó không:
{
private
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
{
private
{ protected
{ public
GV: Võ Hồng Bảo Châu
14/04/2010
6
21

public
y Từ bất kỳ hàm nào có chứa đối tượng thuộc lớp, đều
truy cập được các thành viên có thuộc tính này.
{ Vì vậy những thành viên mang thuộc tính public còn được
xem là thành viên có khả năng giao tiếp với môi trường bên
n
g
oài.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
g
GV: Võ Hồng Bảo Châu
22
private
y private: ngược lại với public, các thành viên mang
thuộc tính private chỉ được truy cập từ những hành
vi thuộc lớp và từ những hành vi bè bạn (friend), từ
những lớp là bè bạn của nó.
{ private là thuộc tính chuẩn của ngôn ngữ C++, để thông báo

OOP-CHƯƠNG 3-XÂY DỰNG LỚP
r

n
g
đâ
y
là nh

n
g

thành viên riên
g
t
ư
c
ủa l

p
, nội bộ
c
ủa l

p

mới nhìn thấy, mới nói chuyện được, chúng không giao tiếp với
thế giới bên ngoài lớp.
GV: Võ Hồng Bảo Châu
23
protected
y protected: để cho phép các thành viên trong
những lớp hậu duệ được quyền truy cập đến.
{ Nói cách khác, ngoài việc nói chuyện với các thành viên của lớp,
những thành viên có thuộc tính truy cập protected còn có
thể
g
iao tiế
p
v

i các thành viên tron

g
l

p
con cháu.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
g
p
g
p
GV: Võ Hồng Bảo Châu
24
Giả sử có lớp sau đây
#include <iostream.h>
class POINT{
int x, y;
public:
void set( int xx, int yy ){
x = xx;

OOP-CHƯƠNG 3-XÂY DỰNG LỚP
y

=

yy;
}
int get( int& xx, int& yy ){
xx = x;
yy = y;

return 1;
}
};
GV: Võ Hồng Bảo Châu
14/04/2010
7
25
main()
{
POINT p;
p
.set
(
10
,
5
);
Không được
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
p(,);
cout << p.x << " " << p.y << endl;
return 1;
}
GV: Võ Hồng Bảo Châu
26
Sửa lại
main()
{
POINT p;
p.set( 10, 5 );

int x y;
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
int x
,
y;
p.get( x,y );
cout << "Coordinate (" << x
<< "," << y << ")\n";
return 1;
}
GV: Võ Hồng Bảo Châu
27
LOẠI HÀNH VI CỦA LỚP
y Tự động thực hiện
y Nhận biết và thay đổi giá trị dữ liệu
y Phép toán
y Đ

c thù của l

p
OOP-CHƯƠNG 3-XÂY DỰNG LỚP

p
Mỗi hành vi có thể có thuộc tính truy cập khác
nhau. Những hành vi chỉ phục vụ cho hành vi khác
của lớp sẽ có thuộc tính là private.
GV: Võ Hồng Bảo Châu
28
SỬ DỤNG CLASS

y Sử dụng class trong chương trình là định nghĩa biến đối tượng
(biến tĩnh, biến động, mảng tĩnh, mảng động)
y Cú pháp:
ClassName Obj, *pObj = new ClassName;
ClassName ObjArr1[100];
ClassName
*
ObjArr2;
ClassName ObjArr2;
int MaxCount=100;
ObjArr2= new ClassName[MaxCount];
Truyền thông báo cho 1 đối tượng:
Obj.Method1();
pObj -> Method2();
ObjArr1[20].Method3();
ObjArr2[7].Method4();
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
14/04/2010
8
VÍ DỤ 1
29
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
VÍ DỤ 2:
public
access
specifier
30
OOP-CHƯƠNG 3-XÂY DỰNG LỚP

GV: Võ Hồng Bảo Châu
VÍ DỤ 3 protected access specifier
31
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
VÍ DỤ 3- private access specifier
32
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
14/04/2010
9
33
Gợi ý về xây dựng chương trình OOP
Xây dựng class
(1) Lấy các khái niệm liên quan đến bài toán (danh từ chính trong đề bài)
để xây dựng thành class (thí dụ: Sinh viên).
(2) Lấy các danh từ mô tả liên quan đến từng khaí niệm ở bước (1). Đó
chính là các thuộc tính của class( thí dụ: tên, tuổi, địa chỉ).
(3) Lấy các tác vụ phải xử lý (động từ trong đề bài). Đó chính là các hành vi
bli

l
ì hà i

đ
ế

pu
bli
c


c

a

c
l
ass
vì hà
m

ma
i
n

c

n
đ
ế
n

c

ng.
(4) Tự hỏi: Để có thể thực hiện hành vi public trong bước 3, có cần thêm
các hành vi phụ trợ nào không? Nếu có thì đó là hành vi thêm.
(5) Môi trường bên ngoài thực sự chỉ cần các hành vi nào thì đó là các hành
vi public. Các hành vi còn lại là các hành vi private hoặc protected.
(5) Liệu lớp này có cần được phát triển thêm để giải các bài toán thuộc

nhóm bài toàn này nữa hay không? Nếu có thì một số hành vi cần có
thuộc tính protected.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
34
Kinh nghiệm
Mỗi thuộc tính của class, người ta thường xây dựng 2
hành vi public:
DataType getPropertyName();
void setProperTyName (DataType
Vl )
new
V
a
l
ue
)
;
Với 2 hành vi này, bên ngoài truy xuất được
từng thuộc tính của đối tượng. Các hành vi
khác đều cần đến các hành vi này.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
35
Thí dụ:
class CIRCLE
{ double x,y,r;
public:

double getR()

{ return r ; }

double getR()
{ return r ; }
void setR (double newr)
{ if ( newr >=0 ) r = newr ;
}

};
Có cơ hội ki

m

tra dữ liệu đầu
vào
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
36
Sử dụng class trong hàm main
y Xác định các biến đối tượng cần có.
y Trật tự xử lý của đề bài chính là trật tự truyền thông
báo cho các đ

i t
ượ
ng
báo cho các đ

i t
ượ

ng
.

OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
14/04/2010
10
BÀI TẬP VÍ DỤ
37
(1) Viết chương trình nhập 1 hệ phương trình bậc
nhất 2 ẩn. Xuất nghiệm.
(2) Viết chương trình nhập 1 mảng số nguyên,
xuất trị lớn nhất, xuất mảng tăng dần.
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
38
Thí dụ:Viết chương trình nhập 1 hệ phương trình bậc nhất 2
ẩn.Xuất nghiệm.
Phân tích:
y Khái niệm liên quan: Hệ phương trình bậc nhất 2
ẩn Æ ax+by = c Î class HPTB1
dx+ey = f

(hà h i

l

) Nh

X


hi

y

c
v

(hà
n
h
v
i c

a
l

p)
:
Nh

p
,
X
u

t

n
ghi


m.
Îclass HPTB1
data: double a,b,c,d,e,f
methods: Nhap() , XuatNghiem()
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
39
#include <conio.h>
#include <iostream.h>
class HPTB1
{ double a,b,c,d,e,f ; // private , default
public : // các hành vi bên ngoài cần để tương tác
void Nhap() // Hiện thực method bên trong khai báo class
{ cout << "Nhap 3 he so a,b,c cua phuong trinh 1 ax+by=c :";
cin>>a>>b>>c;
cout << "Nhap 3 he so d,e,f cua phuong trinh 2 dx+ey=f :";
cin>>d>>e>>f;
}
void XuatNghiem(); // chỉ prototype, để hiện thực bên ngoài khi báo class
};
void PTB1::XuatNghiem() // Hiện thực method bên ngoài khai báo class
{ double D=a*e-b*d
;
;
if (D==0) cout<< "Vo nghiem";
else cout<< "Nghiem x=" << (c*e-b*f)/D << “ Nghiem y=" << (a*f-c*d)/D
<<'\n';
}
void main()

{ HPTB1 p; // định nghĩa 1 hệ phương trình bậc nhất p
clrscr();
p.Nhap(); // Truyền thông báo nhập cho p
p.XuatNghiem(); // Truyền thông báo xuất nghiệm cho p
getch();
}
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
40
Thí dụ: Viết chương trình nhập 1 mảng số nguyên int,
xuất trị lớn nhất, xuất mảng tăng dần.
Phân tích
Khái niệm liên quan : mảng
số int , mô tả bằng int* a,
n
Tác vụ: Input (nhập),
GetMax (lấy trị lớn nhất),
AscSort (sắp xếp tăng),
Output (xu

t). T

t c

đ

u
#include <iostream.h>
#include <conio.h>
class MangInt

{ private: int* a, n;
public:
void Input(); int GetMax();
void AscSort(); void Output();
}
Phải hiện thực bên
ngoài lớp vì có dùng
phát biểu lặp
Output (xu

t). T

t c

đ

u
cần cho bên ngoài truy
xuất vì hàm main cần sử
dụng các tác vụ này.
Giải bài toán:
Cần 1 mảng (tên m).
Trật tự truyền thông báo:
m.Input();
cout << m.GetMax();
m.AscSort(); m.Output;
}
;
void MangInt:: Input()
{ do

{ cout<< “ Number of element:”;
cin>> n;
}
while (n<=0);
a= new int[n]; // cấp bộ nhớ
for (int i=0; i<n;i++)
{ cout << “a[“ << i << “]=“; cin>>a[i]; }
}
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
14/04/2010
11
41
int MangInt:: getMax()
{ int t=a[0];
for (int i=1; i<n;i++)
if (t < a[i]) t=a[i];
return t;
}
void MangInt:: AscSort()
{ for (int i=0; i<n-1;++i)
for (int j= n-1; j>i ; j )
if (a[j] < a[j-1])
// Sử dụng lớp
void main()
{
MangInt m;
Viết chương trình
nhập 1 mảng số nguyên int,
xuất trị lớn nhất,

xuất mảng tăng dần.
{ int t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
void MangInt::Output()
{ for (int i=0; i<n;i++)
cout << a[i] << ‘ ‘ ;
}
{
MangInt m;
m.Input();
cout <<“ Max val:” << m.GetMax()
<<‘\n’;
m.AscSort();
cout << “Sorted array\n”;
m.Output();
getch();
}
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
42
Tóm tắt
y Lập trình OOP cũng tương tự như lập trình POP nhưng mô tả bài
toán dưới dạng các class, các tác vụ xử lý dữ liệu thành các hành vi
của class.
y Khai báo class cũng tương tự như khai báo struct nhưng có khác
struct ở chỗ đưa các tác vụ thao tác lên struct vào trong class và gọi
chúng là các methods của lớp.

struct StructName class ClassName
public
{
<data>
};
Type1 Func1 (StructName stru)
{ <code>}
Type2 Func2 (StructName stru)
{<code>}
các hàm đều toàn cục
{
<data>
Modifier : Type1 Func1 ()
{ <code>}
Modifier : Type2 Func2 ()
{ <code>}
};
Chỉ có method public là toàn cục
public
private
protected
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
43
Tóm tắt (tt)
y Thiết kế class
Làm việc với cái gì Î Tên class.
Mô tả nó bằng gì ? Î Properties
Thao tác gì lên nó Î Behavior
ế

y Sử dụn
g
l

p
là định n
g
hĩa bi
ế
n (đ
ơ
n, mản
g
,
p
ointer)

thuộc lớp theo cú pháp định nghĩa biến của C.
y Nhập dữ liệu cơ bản: cin >> SimpleVar;
y Xuất dữ liệu cơ bản : cout << SimpleData;
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
BÀI TẬP TẠI LỚP
44
y Xây dựng lớp PhanSo
{ Thuộc tính: tử số, mẫu số (số nguyên)
{ Hành vi: Nhập, Xuất (dạng tử số/mẫu số).
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
14/04/2010

12
BÀI TẬP TẠI LỚP
y Xây dựng lớp SinhVien
{ Thuộc tính:
Ù Mã SV (chuỗi kí tự)
Ù Họ tên (chuỗi kí tự).
Ù
Năm sinh(s

nguyên)
45
Ù
Năm sinh(s

nguyên)
.
Ù Lớp (chuỗi kí tự).
Ù ĐCB (điểm cơ bản:số thực).
Ù ĐCN (điểm chuyên ngành: số thực).
{ Hành vi:
Ù Nhập, Xuất.
Ù Tính tuổi (in ra màn hình tuổi, không cần trả về kết quả).
Ù Tính ĐTB (ĐTB=(ĐCB+ĐCN)/2, kết quả trả về là 1 số thực).
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
GV: Võ Hồng Bảo Châu
46
THANH YOU
OOP-CHƯƠNG 3-XÂY DỰNG LỚP
THANH YOU
GV: Võ Hồng Bảo Châu

×