N i dung
1.
L p và
và
i
ng
nh ngh a: tên l p, thu c tính, ph ng th c
Cài t ph ng th c
m b o tính úng n c a d li u
Các thành ph n, ph m vi truy c p
L P TRÌNH
NG
IT
NG
CLASS & OBJECT
2.
3.
4.
Tr n Ph c Tu n
5.
Th vi n hóa
M t ví
ví d
Thi t k l p
Xác
Xác
nh thành ph n d li u
nh thành ph n x lý
Các ph
ng th c/hà
c/hàm
Constructor
Destructor
6.
Hàm b n, l p b n
i
ng (C++)
p: ki u d li u tr u t
ct
i
ng
TÊN L P
li u
thành viên
p các
thao tác
9/6/2009
Hàm
thành viên
ng.
1. L p và
private
protected
public
class TÊNL P
[: <Quy n truy xu t> L PCHA ]
{ <Quy n truy xu t > :
DataType1 memberdata1;
DataType2 memberdata2;
…………….
< Quy n truy xu t > :
memberFunction1();
memberFunction2();
…………..
};
T.P.TU N - LTH T
nh ngh a
các hàm
thành viên
3
i
ng (C++)
Ví d :
Khai báo
p
9/6/2009
2
T.P.TU N - LTH T
9/6/2009
1. L p và
c bi t
class Point {
int xVal, yVal;
public:
void SetPt (int, int);
void OffsetPt (int, int);
};
void Point::SetPt
(int x, int y) {
Point
xVal = x;
yVal = y;
}
void Point::OffsetPt
(int x, int y) {
Point
xVal += x;
yVal += y;
}
void main() {
Point pt;
o ra
i t ng
thu c l p
Point
pt.SetPt(10,20);
pt.OffsetPt(2,2);
……..
i hàm
trên
i t ng
pt.xVal = 10; // úng hay sai?
Point pt1, pt2, pt3;
……….
}
T.P.TU N - LTH T
4
1. L p và
it
i
ng (C++)
1. L p và
ng
i di n cho 1
it
it
i
ng
Tên l p
Các thu c tính
ng th c c a bài toán
ng
các thành ph n d li u
Là ki u (khuôn)
o ra
it
ng
Các ph
ng th c
các thao tác (hàm) tác
i t ng
1. L p và
it
ng – Ví d
class Student
{
public:
char name[30];
int id;
};
it
T.P.TU N - LTH T
6
void main()
{
Student s;
...
printStudent(s);
}
ng
T.P.TU N - LTH T
9/6/2009
ng t i d li u c a
void printStudent(Student s)
{
cout << ”name: ” << s.name << endl;
cout << ”id: ” << s.id << endl;
}
thu c tính
void main()
{
Student s1;
cin >> s1.name;
cin >> s1.id;
}
9/6/2009
5
T.P.TU N - LTH T
9/6/2009
al p
7
9/6/2009
T.P.TU N - LTH T
8
prototype a
ph ng th c
1. L p và
it
ng - Ph
Là hàm c thù v
i t ng
c liên k t v i m t l
it
Tác ng t i các thu c tính c
class Student
{
public:
char name[30];
int id;
void print();
};
ng th c
ng c th
i t ng
...
void main()
{
Student s;
cin >> s.name;
cin >> s.id;
s.print();
}
void Student::print()
{
cout << ”name: ” << name << endl;
cout << ”id: ” << id << endl;
}
9/6/2009
T.P.TU N - LTH T
1. L p và
it
9
ng
1. L p và
Hàm inline:
inline
i thi n t c
th c thi
n b nh (dành cho mã l nh) khi th c thi.
Cách 1:
1
thêm
khóa
inline
class Point {
int xVal, yVal;
public:
void SetPt (int, int);
void OffsetPt (int, int);
};
inline void Point::SetPt
(int x, int y) {
Point
xVal = x;
yVal = y;
}
……………
9/6/2009
it
ng
Ph n l n l i l p trình là do thao tác sai v i
li u
li u không h p l (sai mi n giá tr )
li u không th ng nh t
class Point {
int xVal, yVal;
Cách 2:
2 public:
void SetPt (int x, int y) {
nh
xVal = x;
ngh a
yVal = y;
bên
}
trong
void OffsetPt (int x, int y) {
p
xVal += x;
yVal += y;
}
T.P.TU N - LTH T
10
T.P.TU N - LTH T
9/6/2009
n có k thu
ki m soát v
m b o tính úng
này
n c a d li u
};
11
9/6/2009
T.P.TU N - LTH T
12
1. L p và
it
ng
Date.h:
class Date
{
public:
int y, m, d;
bool set(int yy,int mm,int dd);
};
1. L p và
it
m b o tính úng
T.P.TU N - LTH T
14
T.P.TU N - LTH T
9/6/2009
1. L p và
ng
myCalendar.cpp:
#include ”date.h”;
void main()
{
Date d1, d2;
d1.y = 2001;
d1.m = 2;
d1.d = 29;
...
}
9/6/2009
13
T.P.TU N - LTH T
9/6/2009
date.cpp:
#include ”date.h”
bool Date::set(int yy, int mm, int dd)
{
// ki m tra tính h p l
a tham s
...
myCalendar.cpp:
}
#include ”date.h”;
void main()
{
Date d1, d2;
d1.set(2000, 13, 32);
d2.set(2001, 2, 29);
}
it
ng
Không cho truy c p tr c ti
thu c tính
Gi i pháp
n các
ch có các ph ng th c c a chính
thao tác
c lên các thu c tính
u truy c p tr c
ti
n các thu c
tính thì v n không
ki m soát
c
it
ng
Truy v n và c p nh t thu c tính thông qua
các ph ng th c xác nh
giao di n th c s
al
i t ng
ki m soát tính h p l khi thay i giá tr
n c a d li u
15
9/6/2009
T.P.TU N - LTH T
16
1. L p và
it
Date.h:
class Date
{
public:
int getYear();
int getMonth();
int getDay();
bool set(int, int, int);
void print();
void copyTo(Date&);
bool equalTo(Date&);
private:
int y, m, d;
óng gói/che
};
9/6/2009
1. L p và
T.P.TU N - LTH T
it
ng
1. L p và
Giao di n
d u thông tin
17
ng
9/6/2009
T.P.TU N - LTH T
19
ng
it
tin
18
T.P.TU N - LTH T
9/6/2009
1. L p và
myCalendar.cpp:
#include ”date.h”;
void main()
óng gói/che d u thông tin
{
Date d1, d2;
if (d1.set(2000, 1, 31))
cout << d1.getYear() << endl;
else cout << ”ngay thang khong hop le”;
cout << d1.m; // compile error
d1.d = 30;
// compile error
...
}
it
date.cpp:
#include ”date.h”;
bool Date::set(int yy, int mm, int dd)
{
// ki m tra tính h p l
a tham s
...
}
int Date::getYear()
{
return y;
}
óng gói/che d u thông
...
ng
óng gói i t ng, che d u các thông tin
i t i, truy c
i t ng thông qua
ph ng th c (giao
giao di n) xác nh
m b o tính úng
nc
it
ng
Ng i l p trình ng d ng ch
n bi t giao
di n (ch c n ng, cách dùng); không c n
bi t cách cài t c
i t ng
ng
óng gói/che d u thông tin
9/6/2009
T.P.TU N - LTH T
20
1. L p và
it
ng
Ph m vi truy c p
1. L p và
i Truy
C p
Các thành ph n public
Ph
Ph
Ph
ng th c trong l p
ng th c
p k th a
ng th c ngoài l p
Thà
Thành
Ph n
ng th c trong l p
ng th c
p k th a
9/6/2009
21
2. Th vi n hóa
Các l p c
c xây d ng
ng
c trong nhi u ch ng trình khác
nhau
Phân tách mã ngu
nh ngh a l p và mã
ngu n s
ng l p
Phân tách giao di n a l p và cài t a
p
9/6/2009
T.P.TU N - LTH T
23
TRONG
NGOÀ
L P
NGOÀI
L P K TH A L P
x
protected
x
x
x
public
x
x
x
ng th c trong l p
T.P.TU N - LTH T
Ph m vi truy c p
x
Các thành ph n private
Ph
B N
ng
private
Các thành ph n protected
Ph
Ph
it
9/6/2009
T.P.TU N - LTH T
X
22
Date.h:
#if !defined (_DATE_H__)
#define _DATE_H__
//khai báo th vi n
#include <iostream.h>
class Date
{
private:
int y, m, d;
public:
void set(int yy, int mm, int dd);
void print();
};
#endif
9/6/2009
T.P.TU N - LTH T
24
Date.cpp:
myApp.cpp:
#include ”Date.h”
#include <iostream.h>
#include ”Date.h”
void Date::set(int yy, int mm, int dd)
{
y = yy;
m = mm;
d = dd;
}
void Date::print()
{
cout <
}
9/6/2009
T.P.TU N - LTH T
25
9/6/2009
void Set::Copy (Set &set) {
for (register i = 0; i < card; ++i)
set.elems[i] = elems[i];
set.card = card;
}
Bool Set::Equal (Set &set) {
if (card != set.card)
return false;
for (register i = 0; i < card; ++i)
if (!set.IsMember(elems[i]))
return false;
return true;
}
void Set::Print (void) {
cout << "{";
for (int i = 0; i < card-1; ++i)
cout << elems[i] << ",";
if (card > 0)
cout << elems[card-1];
cout << "}“<
}
Bool Set::IsMember (const int elem) {
for (register i = 0; i < card; ++i)
if (elems[i] == elem)
return true;
return false;
}
void Set::AddElem (const int elem) {
if (IsMember(elem))
return;
if (card < maxCard)
elems[card++] = elem;
else
cout << "Set overflow“<
}
void Set::RmvElem (const int elem) {
for (register i = 0; i < card; ++i)
if (elems[i] == elem) {
for (; i < card-1; ++i) // D ch
elems[i] = elems[i+1];
--card;
}
}
T.P.TU N - LTH T
9/6/2009
26
T.P.TU N - LTH T
3. M t ví d - L p Set (t p h p)
3. M t ví d - L p Set (t p h p)
#include <iostream.h>
const maxCard = 100;
enum Bool {false, true};
class Set {
private:
int elems[maxCard];
int card;
public:
void EmptySet(){ card = 0; }
Bool IsMember (const int);
void AddElem (const int);
void RmvElem (const int);
void Copy (Set&);
Bool Equal (Set&);
void Intersect (Set&, Set&);
void Union (Set&, Set&);
void Print ();
};
void main()
{
Date ngaysinh;
ngaysinh.set(2007, 3, 8);
ngaysinh.print();
}
27
9/6/2009
………
int main (void) {
Set s1, s2;
s1.EmptySet(); s2.EmptySet();
s1.AddElem(10); s1.AddElem(20);
s1.AddElem(30); s1.AddElem(40);
s2.AddElem(30); s2.AddElem(50);
s2.AddElem(10); s2.AddElem(60);
cout << "s1 = "; s1.Print();
cout << "s2 = "; s2.Print();
s2.RmvElem(50);
cout << "s2 - {50} = ";
s2.Print();
if (s1.IsMember(20))
cout << "20 is in s1\n";
if (!s1.Equal(s2))
cout << "s1 <> s2\n";
return 0;
}
T.P.TU N - LTH T
K t
qu ?
28
Th c hành
3. Thi t k L p
o l p Student
Xác
Xác
a.
có các thu c tính tên, mã sinh viên,
trung bình
ph ng th c print()
in thông tin
m
b.
Nhóm kh i t o
Nhóm truy v n thông tin
Nhóm c p nh t thông tin
Nhóm x lý tính toán
Nhóm ki m tra ràng bu c
Vi t ch ng trình ng d ng
nh p
thông tin cho m t s sinh viên, p x p l i
theo th
m trung bình t cao xu ng
th p.
9/6/2009
29
T.P.TU N - LTH T
Thành ph n d li u th ng
c
trong ph m vi protected hay private
Nhóm kh i t o
t
i
Xác nh tr ng thái ban
Ví d :
T.P.TU N - LTH T
u cho
it
ng
KhoiTaoPS (tu=0,mau=1)
KhoiTaoSV (ten=“”,…)
DSLK (Head=Tail=NULL)
….
t
Thành ph n d li u
9/6/2009
30
T.P.TU N - LTH T
9/6/2009
3. Thi t k L p
3. Thi t k L p
Ta c n bi t nh ng thông tin gì v
ng thu c l p này
nh thành ph n d li u
nh thành ph n x lý
Thà
Thành ph n x lý
31
9/6/2009
T.P.TU N - LTH T
32
3. Thi t k L p
3. Thi t k L p
Nhóm truy v n thông tin
Các ph ng th c truy v n (query method) là các
ph ng th c dùng
i v giá tr
a các thành
viên d li u c a m t i t ng
Có nhi u lo i câu h i truy v n có th :
Nhóm truy v n thông tin
i v i các truy v n
n gi n, quy
c t tên
ph ngth c: ti n t “get”, ti p theo là tên c a thành
viên
truy v n
n gi n (“giá tr
a x là bao nhiêu?”)
truy v n
u ki n (“thành viên x có l n h n 10
không?”)
truy v n d n xu t (“t ng giá tr
a các thành viên x
và y là bao nhiêu?”)
int getX();
int getSize();
Các lo i truy v n khác nên có tên có tính mô t
Truy v n
u ki n nên có ti n t “is”
c
m quan tr ng c a ph ng th c truy v n là
nó không nên thay
i tr ng thái hi n t i c a
i
ng
T.P.TU N - LTH T
9/6/2009
33
3. Thi t k L p
9/6/2009
Truy v n và c p nh t
u các ph ng th c get/set ch có nhi m v
cho ta
c và ghi giá tr cho các thành viên d
li u, quy nh các thành viên private
c ích
i gì?
Ngoài vi c b o v các nguyên t c óng gói, ta
còn c n ki m tra xem giá tr
i cho thành viên
li u có h p l hay không.
ng ph ng th c c p nh t cho phép ta th c
hi n vi c ki m tra tr c khi th c s thay i giá
tr
a thành viên.
Cho phép ch các d li u có th truy v n hay thay
i
c truy c p n.
Ng c l i v i truy v n thông tin, các ph ng
th c c p nh t th ng thay i tr ng thái c a
i t ng b ng cách s a i m t ho c nhi u
thành viên d li u c a i t ng ó
ng
n gi n nh t c a các ph ng th c
p nh t là gán m t giá tr nào ó cho m t
thành viên d li u
i v i d ng c p nh t
n gi n, quy
c t
tên: dùng ti n t “set” kèm theo tên thành viên
ns a
int setX(int);
T.P.TU N - LTH T
34
3. Thi t k L p
p nh t thông tin
9/6/2009
T.P.TU N - LTH T
35
9/6/2009
T.P.TU N - LTH T
36
3. Thi t k L p
3. Thi t k L p
Ví d
Nhóm x lý tính toán
int Student::setGPA(double newGPA)
{
if ((newGPA >= 0.0) && (newGPA <= 4.0))
{
this->gpa = newGPA;
return 0; // Return 0 to indicate success
}
else
{
return -1; // Return -1 to indicate failure
}
}
9/6/2009
T.P.TU N - LTH T
Xác nh tr ng thái m i cho i t ng ho c
cung c p thông tin t ng h p t các thu c tính
a i t ng
Ví d :
NhanVien.TinhLuong()
SinhVien.XepLoai()
Nghiem
PhuongTrinh.GiaiPhuongTrinh()
Giatri
PhanSo.TinhGiaTri()
…
Thà
Thành ph n x lý
37
3. Thi t k L p
3. Thi t k L p
Nhóm ki m tra ràng bu c
Ki m tra tính úng
Ví d :
ng c a d li u
2.
a.
b.
Thành ph n x lý
9/6/2009
T.P.TU N - LTH T
39
Bài t p
sung vào l p Date các ph ng th c
thu c các nhóm trên (m i nhóm ít nh t
t ph ng th c)
Cài t trên máy l p t p h p (Set) và
vi t ch ng trình nh p vào 2 t p h p s
nguyên (A,B), sau ó
1.
Ngày tháng n m h p l
Ngày vào làm và ngày sinh
us
a phân s ph i khác 0
ms
a sinh viên >=0 và <=10
…
38
T.P.TU N - LTH T
9/6/2009
9/6/2009
Tính giao c a 2 t p h p v a nh p
Ki m tra xem t p A có ph i là con c a B hay
không
T.P.TU N - LTH T
40
4. Các ph
ng th c/hàm
c bi t
Ph
ng th c kh i t o - Constructor
Ph
ng th c h y - Destructor
4. Các ph
Ph ng th
sau khi i t
ng th c/hàm
c bi
ng
cg it
ng, ng
không tr
i k t qu
c bi t
cg it
c t o ra
ng ngay
i dùng không
cg il i
Có hình th c tên trùng v i tên l p
Th ng làm nhi m v kh i t o d li u cho
ng
Có th khai báo trùng
i
Constructor
9/6/2009
41
T.P.TU N - LTH T
T.P.TU N - LTH T
42
date.cpp:
#include ”date.h”;
Date.h:
class Date
{
public:
Date();
Date(int, int, int);
int getYear();
int getMonth();
int getDay();
bool set(int, int, int);
void set(const Date&);
void print();
void copyTo(Date&);
bool equalTo(const Date&);
private:
int y, m, d;
};
9/6/2009
9/6/2009
T.P.TU N - LTH T
Constructor
Date::Date()
{
y = 2000;
m = 1;
d = 1;
}
Constructor
Date::Date(int yy, int mm, int dd)
{
set(yy, mm, dd);
}
...
43
9/6/2009
T.P.TU N - LTH T
44
Hàm xây d ng (t o)
myCalendar.cpp:
#include ”date.h”;
...
Constructor
void main()
{
Date d1;
Date womenDay(2007, 3, 8);
Date d[100];
d1.print();
womenDay.print();
}
Dùng
nh ngh a và kh i t o i t ng cùng 1 lúc.
Có tên trùng v i tên l p, không có ki u tr
.
Không g i tr c ti p, s
ct
ng g i khi kh i t o t.
Gán giá
giá tr , c p vù
vùng nh cho các d li u thà
thành viên.
viên
class Point {
int xVal, yVal;
public:
Point (int x, int y) {
xVal = x; yVal = y;
}
void OffsetPt (int x, int y) {
xVal += x; yVal += y;
}
};
T.P.TU N - LTH T
9/6/2009
45
Hàm xây d ng (t o)
class Point {
int xVal, yVal;
public:
Point () // Hàm xây d ng m c nhiên
{ xVal = 0; yVal = 0; }
Point (int x, int y) {
xVal = x; yVal = y;
}
Point (float len, float angle) {
xVal = (int) (len * cos(angle));
yVal = (int) (len * sin(angle));
}
void OffsetPt (int , int ); …
};
void main() {
Point p1;
Point p2(10,20);
Point p3(60.3, 3.14);
class Set {
private:
int *elems;
int maxCard;
int card;
public:
Set(const int size) {
elems = new int[size];
maxCard = size;
card = 0;
}
……………
};
void main() {
Set s1(100);
Set s2(20);
Set s3(1000); …
}
Không c n
ph i nh
i hàm
EmptySet()
khi kh i t o
46
T.P.TU N - LTH T
9/6/2009
4. Các ph
m
o
n
void main() {
Point pt1(10,20);
pt1.OffsetPt(2,2);
……..
// Khai báo nào là sai ?
Point pt2;
Point pt3();
Point pt4 = Point(5,5);
Point pt5 = new Point(5,5);
……….
}
ng th c/hàm
c bi t
Ph ng th
c bi
cg it
ng ngay
tr c khi i t ng
c gi i phóng kh i b
nh
Không có tham s , không có ki u tr
i, không
nh ngh a trùng
Th ng
c dùng vào m
ích c bi t là
n d p các tài nguyên mà i t ng s
ng
gi i phóng b nh
óng t p
ng
Destructor
}
9/6/2009
T.P.TU N - LTH T
47
9/6/2009
T.P.TU N - LTH T
48
date.cpp:
#include ”date.h”;
Date.h:
class Date
{
public:
Date();
Date(int, int, int);
int getYear();
int getMonth();
int getDay();
bool set(int, int, int);
...
~Date();
private:
int y, m, d;
};
9/6/2009
Destructor
49
T.P.TU N - LTH T
9/6/2009
n d p 1 i t ng tr c khi nó
c thu h i.
Cú pháp: ~TenLop() { ……... }
Không g i tr c ti p, s
ct
ng g i khi h y b t.
Thu h i vù
vùng nh cho các d li u thà
thành viên là con tr .
Destructor
class Set {
private:
int *elems;
int maxCard;
int card;
public:
Set(const int size) { …… }
~Set() { delete[] elems; }
….
};
T.P.TU N - LTH T
50
Hàm h y
void main()
{
Date d;
f1();
}
9/6/2009
Destructor
Date::~Date()
{
cerr << y << m << d <<” bye!” << endl;
}
...
T.P.TU N - LTH T
myCalendar.cpp:
#include ”date.h”;
void f1()
{
Date d(2007, 1, 1);
}
Date::Date()
{
y = 2000;
m = 1;
d = 1;
}
51
9/6/2009
Set TestFunct1(Set s1) {
Set *s = new Set(50);
return *s;
}
void main() {
Set s1(40), s2(50);
s2 = TestFunct1(s1);
}
T.P.TU N - LTH T
ng c ng
có bao nhiêu
l n hàm h y
cg i?
52
5. Hàm b n, l p b n
5. Hàm b n, l p b n
Hàm SetToReal
dùng
chuy n
p s nguyên
thành t p s th c
p Các
Nguyên
class IntSet {
public:
//...
private:
int elems[maxCard];
int card;
};
IntSet là b n (friend
friend) c a l p RealSet.
void IntSet::SetToReal (RealSet &set) {
set.card = card;
for (register i = 0; i < card; ++i)
set.elems[i] = (float) elems[i];
}
class RealSet {
public:
//...
p Các
private:
Th c
float elems[maxCard];
int card;
};
Gi nguyên nh
ngh a c a l p IntSet
Làm th nào
th c hi n
c
vi c truy xu t
n thành viên
Private ?
53
T.P.TU N - LTH T
9/6/2009
Cách 1: Khai báo hàm thành viên c a l p
Thêm dòng khai báo
Friend cho
hàm thành viên
SetToReal
class RealSet {
public:
//...
friend void IntSet::SetToReal
SetToReal (RealSet&);
private:
float elems[maxCard];
int card;
};
T.P.TU N - LTH T
9/6/2009
54
5. Hàm b n, l p b n
5. Hàm b n, l p b n
Cách 2:
Hàm b n:
Chuy n hàm SetToReal ra ngoài ( c l p).
Khai báo hàm ó là b n a c 2 l p.
class IntSet {
public:
//...
friend void SetToReal (IntSet &, RealSet&);
private:
int elems[maxCard];
int card;
};
class RealSet {
public:
//...
friend void SetToReal (IntSet &, RealSet&);
private:
float elems[maxCard];
int card;
};
9/6/2009
class IntSet {
public:
//...
private:
int elems[maxCard];
int card;
};
T.P.TU N - LTH T
Có quy n truy xu t n t t c các d li u và
hàm thành viên (protected + private) c a 1 l p.
void SetToReal (IntSet& iSet,
RealSet& rSet )
{
rSet.card = iSet.card;
for (int i = 0; i < iSet.card; ++i)
rSet.elems[i] =
(float) iSet.elems[i];
}
L p b n:
t c các hàm trong l p b n: là hàm b n.
class A;
class B { // ……….
friend class A;
};
Hàm c l p
là b n(friend)
a c 2 l p.
55
9/6/2009
class IntSet { ……….. }
class RealSet { // ……….
friend class IntSet;
};
T.P.TU N - LTH T
56
5. Hàm b n, l p b n
5. Hàm b n, l p b n
class CDate
CStudent is a class
{
friend CStudent; // friend class
private:
int d,m,y;
public:
friend void HoanVi(CDate &a,CDate &b);
//friend function
};
9/6/2009
T.P.TU N - LTH T
57
9/6/2009
T.P.TU N - LTH T
59
void HoanVi(CDate &a,CDate &b)
{
int tam;
tam=a.d;a.d=b.d;b.d=tam;
tam=a.m;a.m=b.m;b.m=tam;
tam=a.y;a.y=b.y;b.y=tam;
}
class CStudent
{
private:
int id;
CDate ns;
public:
void setns(int d,int m,int y)
{
ns.d=d; ns.m=m; ns.y=y;
}
};
9/6/2009
T.P.TU N - LTH T
58