[r]
Trang 1Ch ươ ng 3 Khái ni m v l p ệ ề ớ
Nh đã nói trên, l p là khái ni m trung tâm c a l p trìnhư ở ớ ệ ủ ậ
hướng đ i tố ượng, nó là s m r ng c a các khái ni m c u trúcự ở ộ ủ ệ ấ
(struct) c a C và b n ghi (record) c a PASCAL Ngoài các thànhủ ả ủ
ph n d li u (nh c u trúc), l p còn ch a các ầ ữ ệ ư ấ ớ ứ thành ph n hàm ,ầ
còn g i là phọ ương th c (method) hay hàm thành viên (memberứ
function) Cũng gi ng nh c u trúc, l p có th xem nh m t ki uố ư ấ ớ ể ư ộ ể
d li u Vì v y l p còn g i là ki u đ i tữ ệ ậ ớ ọ ể ố ượng và l p đớ ược dùng
đ khai báo các bi n, m ng đ i tể ế ả ố ượng (nh th dùng ki u int đư ể ể ể
khai báo các bi n m ng nguyên) Nh v y t m t l p có th t o raế ả ư ậ ừ ộ ớ ể ạ
(b ng cách khai báo) nhi u đ i tằ ề ố ượng (bi n, m ng) khác nhau.ế ả
M i đ i tỗ ố ượng có vùng nh riêng c a mình Vì v y cũng có thớ ủ ậ ể
quan ni m l p là t p h p các đ i tệ ớ ậ ợ ố ượng cùng ki u.ể
Chương này s trình b y cách đ nh nghĩa l p, cách xây d ngẽ ầ ị ớ ự
phương th c, gi i thích v ph m vi truy nh p, s d ng các thànhứ ả ề ạ ậ ư ụ
ph n c a l p, cách khai báo bi n, m ng c u trúc, l i g i t i cácầ ủ ớ ế ả ấ ờ ọ ớ
phương th c.ứ
§ 1 Đ nh nghĩa l p ị ớ
1 L p đớ ược đ nh nghĩa theo m u:ị ẫ
class tên_l pớ
{
// Khai báo các thành ph n d li u (thu c tính)ầ ữ ệ ộ
// Khai báo các phương th cứ
} ;
// Đ nh nghĩa (xây d ng) các phị ự ương th cứ
Chú ý:
Thu c tính c a l p có th là các bi n, m ng, con tr có ki uộ ủ ớ ể ế ả ỏ ể
chu n (int, float, char, char*, long, ) ho c ki u ngoàiẩ ặ ể chu n đãẩ
đ nh nghĩa trị ước (c u trúc, h p, l p, ) Thu c tính c a l p khôngấ ợ ớ ộ ủ ớ
th có ki u c a chính l p đó, nh ng có th là ki u con tr l pể ể ủ ớ ư ể ể ỏ ớ này, ví d :ụ
class A {
A x ; // Không cho phép, vì x có ki u l p Aể ớ
A *p ; // Cho phép , vì p là con tr ki u l p Aỏ ể ớ
} ;
2 Khi báo các thành ph n c a l p (thu c tính và phầ ủ ớ ộ ương th c)ứ
có th dùng các t khoá private và public đ quy đ nh ph m vi sể ừ ể ị ạ ử
d ng c a các thành ph n N u không quy đ nh c th (không dùngụ ủ ầ ế ị ụ ể các t khoá private và public) thì C++ hi u đó là private ừ ể
Các thành ph n private (riêng) ch đầ ỉ ượ ử ục s d ng bên trong l pớ (trong thân c a các phủ ương th c c a l p) Các hàm không ph i làứ ủ ớ ả
phương th c c a l p không đứ ủ ớ ược phép s d ng các thành ph nử ụ ầ này
Các thành ph n public (công c ng) đầ ộ ược phép s d ng c bênử ụ ở ả trong và bên ngoài l p.ớ
3 Các thành ph n d li u thầ ữ ệ ường (nh ng không b t bu c) khaiư ắ ộ báo là private đ b o đ m tính gi u kín, b o v an toàn d li uể ả ả ấ ả ệ ữ ệ
c a l p, không cho phép các hàm bên ngoài xâm nh p vào d li uủ ớ ậ ữ ệ
c a l p.ủ ớ
4 Các phương th c thứ ường khai báo là public đ chúng có thể ể
được g i t i (s d ng) t các hàm khác trong chọ ớ ử ụ ừ ương trình
5 Các phương th c có th đứ ể ược xây d ng bên ngoài ho c bênự ặ trong đ nh nghĩa l p Thông thị ớ ường, các phương th c ng n đứ ắ ượ c
vi t bên trong đ nh nghĩa l p, còn các phế ị ớ ương th c dài thì vi t bênứ ế ngoài đ nh nghĩa l p.ị ớ
6 Trong thân phương th c c a m t l p (gi s l p A) có thứ ủ ộ ớ ả ử ớ ể
s d ng:ử ụ + Các thu c tính c a l p Aộ ủ ớ
Trang 2+ Các phương th c c a l p Aứ ủ ớ
+ Các hàm t l p trong chự ậ ương trình Vì ph m vi s d ng c aạ ử ụ ủ
hàm là toàn chương trình
7 Giá tr tr v c a phị ả ề ủ ương th c có th có ki u b t kỳ (chu nứ ể ể ấ ẩ
và ngoài chu n)ẩ
Ví dụ sau s minh ho các đi u nói trên Chúng ta s đ nh nghĩaẽ ạ ề ẽ ị
l p đ mô t và x lý các đi m trên màn hình đ ho L p đớ ể ả ử ể ồ ạ ớ ượ c
đăt tên là DIEM
+ Các thu c tính c a l p g m:ộ ủ ớ ồ
int x ; // hoành đ (c t)ộ ộ
int y ; // tung đ (hàng)ộ
int m ; // m uầ
+ Các phương th c:ứ
Nh p d li u m t đi mậ ữ ệ ộ ể
Hi n th m t đi mể ị ộ ể
n m t đi m
L p đi m đớ ể ược xây d ng nh sau:ự ư
class DIEM
{
private:
int x, y, m ;
public:
void nhapsl() ;
void hien() ;
void an()
{
putpixel(x, y, getbkcolor());
}
} ;
void DIEM::nhap() {
cout << “\nNh p hoành đ (c t) và tung đ (hàng) c a đi m:ậ ộ ộ ộ ủ ể
“ cin >> x >> y ; cout << “\nNh p mã m u c a đi m: “ ậ ầ ủ ể cin >> m ;
} void DIEM::hien() {
int mau_ht ; mau_ht = getcolor();
putpixel(x, y, m);
setcolor(mau_ht);
} Qua ví d trên có th rút ra m t s đi u c n nh sau:ụ ể ộ ố ề ầ ớ + Trong c 3 phả ương th c (dù vi t trong hay vi t ngoài đ nhứ ế ế ị nghĩa l p) đ u đớ ề ược phép truy nh p đ n các thu c tính x, y và mậ ế ộ
c a l p.ủ ớ + Các phương th c vi t bên trong đ nh nghĩa l p (nh phứ ế ị ớ ư ươ ng
th c an() ) đứ ược vi t nh m t hàm thông thế ư ộ ường
+ Khi xây d ng các phự ương th c bên ngoài l p, c n dùng thêmứ ớ ầ tên l p và toán t ph m vi :: đ t ngay trớ ử ạ ặ ước tên phương ph c đứ ể quy đ nh rõ đây là phị ương th c c a l p nào.ứ ủ ớ
§ 2 Bi n, m ng đ i t ế ả ố ượ ng
Nh đã nói trên, m t l p (sau khi đ nh nghĩa) có th xem như ở ộ ớ ị ể ư
m t ki u đ i tộ ể ố ượng và có th dùng đ khai báo các bi n, m ngể ể ế ả
đ i tố ượng Cách khai báo bi n, m ng đ i tế ả ố ượng cũng gi ng nhố ư
Trang 3khai báo bi n, m ng các kiế ả ểu khác (nh int, float, c u trúc,ư ấ
h p, ), theo m u sau:ợ ẫ
Tên_l p danh sách đ i ;ớ ố
Tên_l p danh sách m ng ;ớ ả
Ví dụ s d ng l p DIEM ử ụ ớ ở §1, có th khai báo các bi n, m ngể ế ả
DIEM nh sau:ư
DIEM d1, d2, d3 ; // Khai báo 3 bi n đ i tế ố ượng d1, d2, d3
DIEM d[20] ; // Khai báo m ng đ i tả ố ượng d g m 20 ph nồ ầ
tử
M i đ i tỗ ố ượng sau khi khai báo s đẽ ượ ấc c p phát m t vùng nhộ ớ
riêng đ ch a các thu c tính c a chúng Chú ý r ng s không cóể ứ ộ ủ ằ ẽ
vùng nh riêng đ ch a các phớ ể ứ ương th c cho m i đ i tứ ỗ ố ượng Các
phương th c s đứ ẽ ược s d ng chung cho t t c các đ i tử ụ ấ ả ố ượ ng
cùng l p Nh v y v b nh đớ ư ậ ề ộ ớ ược c p phát thì đ i tấ ố ượng gi ngố
c u trúc Trong trấ ương h p này:ợ
sizeof(d1) = sizeof(d2) = sizeof(d3) = 3*sizeof(int) = 6
sizeof(d) = 20*6 = 120
Thu c tính c a đ i t ộ ủ ố ượ ng:
Trong ví d trên, ụ m i đ i tỗ ố ượng d1, d2, d3 và m i ph n t d[i]ỗ ầ ử
đ u có 3 thu c tính là x, y, m Chú ý là m i thu c đ u thu c về ộ ỗ ộ ề ộ ề
m t đ i tộ ố ượng, vì v y không th vi t tên thu c m t cách riêng rậ ể ế ộ ộ ẽ
mà bao gi cũng ph i có tên đ i tờ ả ố ượng đi kèm, gi ng nh cách vi tố ư ế
trong c u trúc c a C hay b n ghi c a PASCAL Nói cách khác,ấ ủ ả ủ
cách vi t thu c tính c a đ i tế ộ ủ ố ượng nh sau:ư
tên_đ i_tố ượng.Tên_thu c_tính ộ
V i các đ i tớ ố ượng d1, d2, d3 và m ng d, có th vi t nh sau:ả ể ế ư
d1.x // Thu c tính x c a đ i tộ ủ ố ượng d1
d2.x // Thu c tính x c a đ i tộ ủ ố ượng d2
d3.y // Thu c tính y c a đ i tộ ủ ố ượng d3
d[2].m // Thu c tính m c a ph n t d[2]ộ ủ ầ ử
d1.x = 100 ; // Gán 100 cho d1.x d2.y = d1.x; // Gán d1.x cho d2.y
S d ng các ph ử ụ ươ ng th c ứ
Cũng gi ng nh hàm, m t phố ư ộ ương th c đứ ược s d ng thôngử ụ qua l i g i Tuy nhiênờ ọ trong l i g i phờ ọ ương th c bao gi cũngứ ờ
ph i có tên đ i tả ố ượng đ ch rõ phể ỉ ương th c th c hi n trên cácứ ự ệ thu c tính c a đ i tộ ủ ố ượng nào Ví d l i g i:ụ ờ ọ
d1.nhapsl();
s th c hi n nh p s li u vào các thành ph n d1.x, d1.y và d1.m ẽ ự ệ ậ ố ệ ầ Câu l nhệ
d[3].nhapsl() ;
s th c hi n nh p s li u vào các thành ph n d[3].x, d[3].y vàẽ ự ệ ậ ố ệ ầ d[3].m
Chúng ta s minh ho các đi u nói trên b ng m t chẽ ạ ề ằ ộ ương trình
đ n gi n s d ng l p DIEM đ nh p 3 đi m, hi n r i n cácơ ả ử ụ ớ ể ậ ể ệ ồ ẩ
đi m v a nh p Trong chể ừ ậ ương trình đ a vào hàm kd_do_hoa()ư dùng đ kh i đ ng h đ ho ể ở ộ ệ ồ ạ
#include <conio.h>
#include <iostream.h>
#include <graphics.h>
class DIEM {
private:
int x, y, m ; public:
void nhapsl();
void an() { putpixel(x,y,getbkcolor());
Trang 4void hien();
};
void DIEM::nhapsl()
{
cout << "\nNhap hoanh do (cot) va tung do (hang) cua diem:
" ;
cin >> x >> y ;
cout << " \nNhap ma mau cua diem: " ;
cin >> m ;
}
void DIEM::hien()
{
int mau_ht;
mau_ht = getcolor() ;
putpixel(x,y,m);
setcolor(mau_ht);
}
void kd_do_hoa()
{
int mh, mode ;
mh=mode=0;
initgraph(&mh, &mode, "");
}
void main()
{
DIEM d1, d2, d3 ;
d1.nhapsl();
d2.nhapsl();
d3.nhapsl();
kd_do_hoa();
setbkcolor(BLACK);
d1.hien();
d2.hien();
d3.hien();
getch();
d1.an();
d2.an();
d3.an();
getch();
closegraph();
}
§ 3 Con tr đ i t ỏ ố ượ ng
Con tr đ i tỏ ố ượng dùng đ ch a đ a ch c a bi n, m ng đ iể ứ ị ỉ ủ ế ả ố
tượng Nó được khai báo nh sau:ư Tên_l p *con tr ;ớ ỏ
Ví dụ dùng l p DIEM có th khai báo: ớ ể DIEM *p1 , *p2, *p3 ; // khai báo 3 con tr p1, p2, p3ỏ DIEM d1, d2 ; // Khai báo 2 đ i tố ượng d1, d2
DIEM d[20] ; // Khai báo m ng đ i tả ố ượng
và có th th c hi n các câu l nh:ể ự ệ ệ p1 = &d2 ; // p1 ch a đ a ch c a d2 , hay p1 tr t i d2ứ ị ỉ ủ ỏ ớ p2 = d ; // p2 tr t i đ u m ng dỏ ớ ầ ả
Trang 5p3 = new DIEM // T o m t đ i tạ ộ ố ượng và ch a đ a ch c a nó ứ ị ỉ ủ
// vào p3
Đ s d ng thu c tính c a đ i tể ử ụ ộ ủ ố ượng thông qua con tr , ta vi tỏ ế
nh sau:ư
Tên_con_tr ->Tên_thu c_tínhỏ ộ
Chú ý: N u con tr ch a đ a ch đ u c a m ng, có th dùngế ỏ ứ ị ỉ ầ ủ ả ể
con tr nh tên m ng ỏ ư ả
Nh v y sau khi th c hi n các câu l nh trên thì:ư ậ ự ệ ệ
p1->x và d2.x là nh nhauư
p2[i].y và d[i].y là nh nhauư
Tóm l i ta có quy t c sau ạ ắ
Quy t c s d ng thu c tính: ắ ử ụ ộ Đ s d ng m t thu c tính c aể ử ụ ộ ộ ủ
đ i tố ượng ta ph i dùng phép ho c phép -> Trong chả ặ ương trình,
không cho phép vi t tên thu c tính m t cách đ n đ c mà ph i điế ộ ộ ơ ộ ả
kèm tên đ i tố ượng ho c tên con tr theo các m u sau:ặ ỏ ẫ
Tên_đ i_tố ượng.Tên_thu c_tínhộ
Tên_con_tr ->Tên_thu c_tínhỏ ộ
Tên_m ng_đ i_tả ố ượng[ch _s ].Tên_thu c_tínhỉ ố ộ
Tên_con_tr [ch _s ].Tên_thu c_tínhỏ ỉ ố ộ
Chương trình dưới đây cũng s d ng l p DIEM (trong ử ụ ớ §1) để
nh p m t d y đi m, hi n th và n các đi m v a nh p Chậ ộ ẫ ể ể ị ẩ ể ừ ậ ươ ng
trình dùng m t con tr ki u DIEM và dùng toán t new đ t o raộ ỏ ể ử ể ạ
m t d y đ i tộ ẫ ố ượng
#include <conio.h>
#include <iostream.h>
#include <graphics.h>
class DIEM
{
private:
int x, y, m ; public:
void nhapsl();
void an() { putpixel(x,y,getbkcolor());
} void hien();
};
void DIEM::nhapsl() {
cout <<"\nNhap hoanh do (cot) va tung do (hang) cua diem:" ; cin >> x >> y ;
cout << " \nNhap ma mau cua diem: " ; cin >> m ;
} void DIEM::hien() {
int mau_ht;
mau_ht = getcolor() ; putpixel(x,y,m);
setcolor(mau_ht);
} void kd_do_hoa() {
int mh, mode ; mh=mode=0;
initgraph(&mh, &mode, "");
Trang 6is >> d.a[i] ;
}
return is;
}
DT DT::operator-()
{
DT p;
p.n = n;
p.a = new double[n+1];
for (int i=0 ; i<=n ; ++i)
p.a[i] = -a[i];
return p;
}
DT DT::operator+(const DT &d2)
{
DT d;
int k,i;
k = n > d2.n ? n : d2.n ;
d.a = new double[k+1];
for (i=0; i<=k ; ++i)
if (i<=n && i<=d2.n)
d.a[i] = a[i] + d2.a[i];
else if (i<=n)
d.a[i] = a[i];
else
d.a[i] = d2.a[i];
i=k;
while(i>0 && d.a[i]==0.0) i;
d.n = i;
return d ; }
DT DT::operator-(DT d2) {
return (*this + (-d2));
}
DT DT::operator*(const DT &d2) {
DT d;
int k, i, j;
k = d.n = n + d2.n ; d.a = new double[k+1];
for (i=0; i<=k; ++i) d.a[i] = 0;
for (i=0 ; i<= n ; ++i) for (j=0 ; j<= d2.n ; ++j) d.a[i+j] += a[i]*d2.a[j] ; return d;
} double DT::operator^(const double &x) {
double s=0.0 , t=1.0;
for (int i=0 ; i<= n ; ++i) {
s += a[i]*t;
t *= x;
}
Trang 7return s;
}
void main()
{
DT p,q,r,s,f;
double x1,x2,g1,g2;
clrscr();
cout <<"\nNhap da thuc P " ; cin >> p;
cout << "\nDa thuc p " << p ;
cout <<"\nNhap da thuc Q " ; cin >> q;
cout << "\nDa thuc q " << q ;
cout <<"\nNhap da thuc R " ; cin >> r;
cout << "\nDa thuc r " << r ;
cout <<"\nNhap da thuc S " ; cin >> s;
cout << "\nDa thuc s " << s ;
f = -(p+q)*(r-s);
cout << "\nNhap so thuc x1: " ; cin >> x1;
cout << "\nNhap so thuc x2: " ; cin >> x2;
g1 = f^x1;
g2 = F(f,x2);
cout << "\nDa thuc f " << f ;
cout << "\n f("<<x1<<") = " << g1;
cout << "\n f("<<x2<<") = " << g2;
getch();
149