[r]
(1)Chương 3 Khái ni m v l pệ ề ớ
Nh nói trên, l p khái ni m trung tâm c a l p trìnhư ệ ủ ậ
hướng đ i tố ượng, s m r ng c a khái ni m c u trúcự ộ ủ ệ ấ
(struct) c a C b n ghi (record) c a PASCAL Ngoài thànhủ ả ủ
ph n d li u (nh c u trúc), l p ch a ầ ữ ệ ấ ứ thành ph n hàm ,ầ
còn g i 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 ki u đ i tữ ệ ậ ọ ể ố ượng l p đớ ược dùng đ khai báo bi n, m ng đ i tể ế ả ố ượng (nh th dùng ki u int đư ể ể ể
khai báo 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 Vì v y có thớ ủ ậ ể
quan ni m l p t p h p đ i tệ ậ ợ ố ượng ki u.ể
Chương 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 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.ứ
§ Đ nh nghĩa l pị ớ L p đớ ược đ nh nghĩa theo m u:ị ẫ
class tên_l pớ
{
// Khai báo thành ph n d li u (thu c tính)ầ ữ ệ ộ
// Khai báo phương th
} ;
// Đ nh nghĩa (xây d ng) phị ự ương th Chú ý:
Thu c tính c a l p có th bi n, m ng, 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 l p đó, nh ng có th ki u tr l pể ể ủ ể ể ỏ
này, ví d :ụ
class A {
A x ; // Không cho phép, x có ki u l p Aể
A *p ; // Cho phép , p tr ki u l p Aỏ ể
} ;
2 Khi báo thành ph n c a l p (thu c tính phầ ủ ộ ương th c)ứ
có th dùng t khố private public đ quy đ nh ph m vi sể ể ị
d ng c a thành ph n N u không quy đ nh c th (không dùngụ ủ ầ ế ị ụ ể
các t khố private public) C++ hi u private ể
Các thành ph n private (riêng) ch đầ ỉ ượ ục s d ng bên l pớ
(trong thân c a 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 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 bên 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 private đ b o đ m tính gi u kín, b o v an tồn d li uể ả ả ấ ả ệ ữ ệ
c a l p, không cho phép hàm bên 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 public đ chúng ể
được g i t i (s d ng) t hàm khác chọ ụ ương trình
5 Các phương th c có th đứ ể ược xây d ng bên ho c bênự ặ
trong đ nh nghĩa l p Thông thị ường, phương th c ng n đứ ắ ược vi t bên đ nh nghĩa l p, phế ị ương th c dài 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ộ ủ
(2)+ Các phương th c c a l p Aứ ủ
+ Các hàm t l p chự ậ ương trình Vì ph m vi s d ng c aạ ụ ủ
hàm tồ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à ngồi chu n)ẩ
Ví dụ sau s minh ho u nói Chúng ta s đ nh nghĩaẽ ề ẽ ị
l p đ mô t x lý m hình đ ho L p đớ ể ả ể ược đăt tên 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 mậ ữ ệ ộ ể
Hi n th m t mể ị ộ ể
n m t m
ẩ ộ ể
L p 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) tung đ (hàng) c a m:ậ ộ ộ ộ ủ ể
“
cin >> x >> y ;
cout << “\nNh p mã m u c a m: “ ậ ầ ủ ể
cin >> m ; }
void DIEM::hien() {
int mau_ht ;
mau_ht = getcolor(); putpixel(x, y, m); setcolor(mau_ht); }
Qua ví d có th rút m t s u c n nh sau:ụ ể ộ ố ề ầ
+ Trong c phả ương th c (dù vi t hay vi t đ nhứ ế ế ị
nghĩa l p) đ u đớ ề ược phép truy nh p đ n thu c tính x, y mậ ế ộ
c a l p.ủ
+ Các phương th c vi t bên đ nh nghĩa l p (nh phứ ế ị ương th c an() ) đứ ược vi t nh m t hàm thông ộ ường
+ Khi xây d ng phự ương th c bên l p, c n dùng thêmứ ầ
tên l p toán t ph m vi :: đ t trớ ặ ước tên phương ph c đứ ể
quy đ nh rõ phị ương th c c a l p nào.ứ ủ § Bi n, m ng đ i tế ả ố ượng
Nh nói trên, m t l p (sau đ nh nghĩa) có th xem ộ ị ể
m t ki u đ i tộ ể ố ượng có th dùng đ khai báo bi n, m ngể ể ế ả
đ i tố ượng Cách khai báo bi n, m ng đ i tế ả ố ượng gi ng nhố
(3)khai báo bi n, m ng 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 bi n, m ngể ế ả
DIEM nh sau:ư
DIEM d1, d2, d3 ; // Khai báo 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 khai báo s đẽ ượ ấc c p phát m t vùng nhộ
riêng đ ch a thu c tính c a chúng Chú ý r ng s khơng cóể ứ ộ ủ ằ ẽ
vùng nh riêng đ ch a 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 đ i tử ụ ấ ả ố ượng l p Nh v y v b nh đớ ậ ề ộ ược c p phát đ 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) = 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 m i ph n t d[i]ỗ ầ
đ u có thu c tính x, y, m Chú ý m i thu c đ u thu c ộ ỗ ộ ề ộ ề
m t đ i tộ ố ượng, v y khơng th vi t tên thu c m t cách riêng rậ ể ế ộ ộ ẽ
mà bao gi ph i có tên đ i tờ ả ố ượng 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 đ i tớ ố ượng d1, d2, d3 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 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ờ ọ 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 cácứ ự ệ
thu c tính c a đ i tộ ủ ố ượng Ví d l i g i:ụ ọ
d1.nhapsl();
s th c hi n nh p s li u vào thành ph n d1.x, d1.y d1.m ẽ ự ệ ậ ố ệ ầ
Câu l nhệ
d[3].nhapsl() ;
s th c hi n nh p s li u vào thành ph n d[3].x, d[3].y vàẽ ự ệ ậ ố ệ ầ
d[3].m
Chúng ta s minh ho u nói b ng m t chẽ ề ằ ộ ương trình đ n gi n s d ng l p DIEM đ nh p 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());
(4)}
void hien(); };
void DIEM::nhapsl() {
cout << "\nNhap hoanh (cot) va tung (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(); }
§ 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ó 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 tr p1, p2, p3ỏ
DIEM d1, d2 ; // Khai báo đ i tố ượng d1, d2 DIEM d[20] ; // Khai báo m ng đ i tả ố ượng có th th c hi n 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ỏ ầ ả
(5)p3 = new DIEM // T o m t đ i tạ ộ ố ượng ch a đ a ch c a ứ ị ỉ ủ
// vào p3
Đ s d ng thu c tính c a đ i tể ụ ộ ủ ố ượng thông qua tr , ta vi tỏ ế
nh sau:ư
Tên_con_tr ->Tên_thu c_tínhỏ ộ
Chú ý: N u 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 th c hi n câu l nh thì:ư ậ ự ệ ệ
p1->x d2.x nh nhauư
p2[i].y d[i].y 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 tr theo 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 s d ng l p DIEM (trong ụ §1) để
nh p m t d y m, hi n th n m v a nh p Chậ ộ ẫ ể ể ị ẩ ể ậ ương trình dùng m t tr ki u DIEM 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 (cot) va tung (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, "");
(6)is >> 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; }
(7)return 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();
} 147 148