[r]
Trang 1Ch ươ ng 4
Hàm t o, hàm hu và các ạ ỷ
v n đ liên quan ấ ề
Chương này trình b y m t s v n đ có tính chuyên sâu h n vầ ộ ố ấ ề ơ ề
l p nh :ớ ư
+ Hàm t o (constructor)ạ
+ Hàm hu (destructor)ỷ
+ Toán t gán và hàm t o sao chépử ạ
+ M i liên quan gi a hàm t o và đ i tố ữ ạ ố ượng thành ph n ầ
+ Các thành ph n tĩnhầ
+ L p b n, hàm b nớ ạ ạ
+ Đ i tố ượng h ngằ
+ Phương th c inlineứ
§ 1 Hàm t o (constructor) ạ 1.1 Công d ng ụ
Hàm t o cũng là m t phạ ộ ương th c c a l p (nh ng khá đ cứ ủ ớ ư ặ
bi t) dùng đ t o d ng m t đ i tệ ể ạ ự ộ ố ượng m i Chớ ương trình d ch sị ẽ
c p phát b nh cho đ i tấ ộ ớ ố ượng sau đó s g i đ n hàm t o Hàmẽ ọ ế ạ
t o s kh i gán giá tr cho các thu c tính c a đ i tạ ẽ ở ị ộ ủ ố ượng và có thể
th c hi n m t s công vi c khác nh m chu n b cho đ i tự ệ ộ ố ệ ằ ẩ ị ố ượ ng
m i.ớ
1.2 Cách vi t hàm t o ế ạ
th ườ ng
Khi vi t hàm t o c n đ ý 3 s khác bi t c a hàm t o so v iế ạ ầ ể ự ệ ủ ạ ớ
các phương th c khác nh sau:ứ ư
+ Tên c a hàm t o: Tên c a hàm t o b t bu c ph i trùng v iủ ạ ủ ạ ắ ộ ả ớ
tên c a l p.ủ ớ
+ Không khai báo ki u cho hàm t o.ể ạ + Hàm t o không có k t qu tr v ạ ế ả ả ề
1.2.2 S gi ng nhau c a hàm t o và các ph ự ố ủ ạ ươ ng th c thông ứ
th ườ ng
Ngoài 3 đi m khác bi t trên, hàm t o để ệ ạ ược vi t nh cácế ư
phương th c khác:ứ + Hàm t o có th đạ ể ược xây d ng bên trong ho c bên ngoài đ nhự ặ ị nghĩa l p.ớ
+ Hàm t o có th có đ i ho c không có đ i.ạ ể ố ặ ố + Trong m t l p có th có nhi u hàm t o (cùng tên nh ng khácộ ớ ể ề ạ ư
b đ i).ộ ố
Ví dụ sau đ nh nghĩa l p DIEM_DH (Đi m đ ho ) có 3 thu cị ớ ể ồ ạ ộ tính:
int x; // hoành đ (c t) c a đi mộ ộ ủ ể int y; // tung đ (hàng) c a đi mộ ủ ể int m; // m u c a đi mầ ủ ể
và đ a vào 2 hàm t o đ kh i gán cho các thu c tính c a l p:ư ạ ể ở ộ ủ ớ // Hàm t o không đ i: Dùng các giá tr c đ nh đ kh i gán cho ạ ố ị ố ị ể ở // x, y, m
DIEM_DH() ; // Hàm t o có đ i: Dùng các đ i x1, y1, m1 đ kh i gán cho ạ ố ố ể ở // x, y, m
// Đ i m1 có giá tr m c đ nh 15 (m u tr ng)ố ị ặ ị ầ ắ DIEM_DH(int x1, int y1, int m1=15) ;
class DIEM_DH {
private:
int x, y, m ; public:
Trang 2//Hàm t o không đ i: kh i gán cho x=0, y=0, m=1ạ ố ở
// Hàm này vi t bên trong đ nh nghĩa l pế ị ớ
DIEM_DH()
{
x=y=0;
m=1;
}
// Hàm t o này xây d ng bên ngoài đ nh nghĩa l pạ ự ị ớ
DIEM_DH(int x1, int y1, int m1=15) ;
// Các phương th c khácứ
} ;
// Xây d ng hàm t o bên ngoài đ nh nghĩa l pự ạ ị ớ
DIEM_DH:: DIEM_DH(int x1, int y1, int m1)
{
x=x1; y=y1; m=m1;
}
+ Khi đã xây d ng các hàm t o, ta có th dùnự ạ ể g chúng trong khai
báo đ t o ra m t đ i tể ạ ộ ố ượng đ ng th i kh i gán cho các thu c tínhồ ờ ở ộ
c a đ i tủ ố ượng đượ ạc t o D a vào các tham s trong khai báo màự ố
Trình biên d ch s bi t c n g i đ n hàm t o nào ị ẽ ế ầ ọ ế ạ
+ Khi khai báo m t bi n đ i tộ ế ố ượng có th s d ng các tham sể ử ụ ố
đ kh i gán cho các thu c tính c a bi n đ i tể ở ộ ủ ế ố ượng
+ Khi khai báo m ng đ i tả ố ượng không cho phép dùng các tham
s đ kh i gán.ố ể ở
+ Câu l nh khai báo m t bi n đ i tệ ộ ế ố ượng s g i t i hàm t o 1ẽ ọ ớ ạ
l nầ
+ Câu l nh khai báo m t m ng n đ i tệ ộ ả ố ượng s g i t i hàm t oẽ ọ ớ ạ
n l n.ầ
Ví d : ụ
DIEM_DH d; // G i t i hàm t o không đ i.ọ ớ ạ ố // K t qu d.x=0, d.y=0, d.m=1ế ả DIEM_DH u(200,100,4); // G i t i hàm t o có đ i.ọ ớ ạ ố // K t qu u.x=200, u.y=100, d.m=4ế ả DIEM_DH v(300,250); // G i t i hàm t o có đ i.ọ ớ ạ ố
// K t qu v.x=300, v.y=250, d.m=15ế ả DIEM_DH p[10] ; // G i t i hàm t o không đ i 10 l nọ ớ ạ ố ầ
Chú ý: V i các hàm có đ i ki u l p, thì đ i ch xem là các thamớ ố ể ớ ố ỉ
s hình th c, vì v y khai báo đ i (trong dòng đ u c a hàm) số ứ ậ ố ầ ủ ẽ không t o ra đ i tạ ố ượng m i và do đó không g i t i các hàm t o.ớ ọ ớ ạ
1.4 Dùng hàm t o trong c p phát b nh ạ ấ ộ ớ
+ Khi c p phát b nh cho m t đ i tấ ộ ớ ộ ố ượng có th dùng các thamể
s đ kh i gán cho các thu c tính c a đ i tố ể ở ộ ủ ố ượng, ví d :ụ DIEM_DH *q =new DIEM_DH(50,40,6);//G i t i hàm t o cóọ ớ ạ
đ iố // K t qu q->x=50, q->y=40, q->m=6ế ả DIEM_DH *r = new DIEM_DH ; // G i t i hàm t o không đ iọ ớ ạ ố // K t qu r->x=0, r->y= 0, r->m=1ế ả + Khi c p phát b nh cho m t d y đ i tấ ộ ớ ộ ẫ ố ượng không cho phép dùng tham s đ kh i gán, ví d :ố ể ở ụ
int n=20;
DIEM_DH *s = new DIEM_DH[n] ; // G i t i hàm t oọ ớ ạ không
// đ i 20 l n.ố ầ
1.5 Dùng hàm t o đ bi u di n các đ i t ạ ể ể ễ ố ượ ng h ng ằ
+ Nh đã bi t, sau kư ế hi đ nh nghĩa l p DIEM_DH thì có th xemị ớ ể
l p này nh m t ki u d li u nh int, double, char, ớ ư ộ ể ữ ệ ư
Trang 3V i ki u int chúng ta có các h ng int, nh 356.ớ ể ằ ư
V i ki u double chúng ta có các h ng double, nh 98.75ớ ể ằ ư
Khái ni m h ng ki u int, h ng ki u double có th m r ng choệ ằ ể ằ ể ể ở ộ
h ng ki u DIEM_DHằ ể
+ Đ bi u di n m t h ng đ i tể ể ễ ộ ằ ố ượng (hay còn g i: Đ i tọ ố ượ ng
h ng) chúng ta ph i dùng t i hàm t o M u vi t nh sau:ằ ả ớ ạ ẫ ế ư
Tên_l p(danh sách tham s ) ;ớ ố
Ví dụ đ i v i l p DIEM_DH nói trên, có th vi t nh sau:ố ớ ớ ể ế ư
DIEM_DH(345,123,8) // Bi u th m t đ i tể ị ộ ố ượng ki uể
DIEM_DH
// có các thu c tính x=345, y=123, m=8ộ
Chú ý: Có th s d ng m t h ng đ i tể ử ụ ộ ằ ố ượng nh m t đ iư ộ ố
tượng Nói cách khác, có th dùng h ng đ i tể ằ ố ượng đ th c hi nể ự ệ
m t phộ ương th c, ví d n u vi t:ứ ụ ế ế
DIEM_DH(345,123,8).in();
thì có nghĩa là th c hi n phự ệ ương th c in() đ i v i h ng đ i tứ ố ớ ằ ố ượng
1.6 Ví d minh ho ụ ạ
Chương trình sau đây minh ho cách xây d ng hàm t o và cáchạ ự ạ
s dùng hàm t o trong khai báo, trong c p phát b nh và trongử ạ ấ ộ ớ
vi c bi u di n các h nệ ể ễ ằ g đ i tố ượng
//CT4_02.CPP
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
class DIEM_DH
{
private:
int x,y,m;
public:
// Hàm b n dùng đ in đ i tạ ể ố ượng DIEM_DH friend void in(DIEM_DH d)
{ cout <<"\n " << d.x << " "<< d.y<<" " << d.m ; }
// Phương th c dùng đ in đ i tứ ể ố ượng DIEM_DH void in()
{ cout <<"\n " << x << " "<< y<<" " << m ; }
//Hàm t o không đ iạ ố DIEM_DH()
{ x=y=0;
m=1;
} //Hàm t o có đ i, đ i m1 có giá tr m c đ nh là 15 (m uạ ố ố ị ặ ị ầ
tr ng)ắ
DIEM_DH(int x1,int y1,int m1=15);
};
//Xây d ng hàm t oự ạ DIEM_DH::DIEM_DH(int x1,int y1,int m1) {
x=x1; y=y1; m=m1;
} void main() {
DIEM_DH d1; // G i t i hàm t o không đ iọ ớ ạ ố DIEM_DH d2(200,200,10); // G i t i hàm t o có đ iọ ớ ạ ố
Trang 4DIEM_DH *d;
d= new DIEM_DH(300,300); // G i t i hàm t o có đ iọ ớ ạ ố
clrscr();
in(d1); //G i hàm b n in()ọ ạ
d2.in();//G i phọ ương th c in()ứ
in(*d); //G i hàm b n in()ọ ạ
DIEM_DH(2,2,2).in();//G i phọ ương th c in()ứ
DIEM_DH t[3]; // 3 l n g i hàm t o không đ iầ ọ ạ ố
DIEM_DH *q; // G i hàm t o không đ iọ ạ ố
int n;
cout << "\nN= ";
cin >> n;
q=new DIEM_DH[n+1]; // (n+1) l n g i hàm t o không đ iầ ọ ạ ố
for (int i=0;i<=n;++i)
q[i]=DIEM_DH(300+i,200+i,8);//(n+1) l n g i hàm t o cóầ ọ ạ
đ iố
for (i=0;i<=n;++i)
q[i].in(); // G i phọ ương th c in()ứ
for (i=0;i<=n;++i)
DIEM_DH(300+i,200+i,8).in();// G i phọ ương th c in()ứ
getch();
}
§ 2 L p không có hàm t o và hàm t o m c đ nh ớ ạ ạ ặ ị
Các chương trình nêu trong chương 3 đ u không có hàm t o.ề ạ
V y khi đó các đ i tậ ố ượng được hình thành nh th nào ?ư ế
2.1 N u l p không có hàm t o ế ớ ạ , Chương trình d ch s cung c pị ẽ ấ
m t hàm t o m c đ nh không đ i (default) Hàm này th c ch tộ ạ ặ ị ố ự ấ
không làm gì c Nh v y m t đ i tả ư ậ ộ ố ượng t o ra ch đạ ỉ ược c p phátấ
b nh , còn các thu c tính c a nó ch a độ ớ ộ ủ ư ược xác đ nh Chúng ta cóị
th ki m ch ng đi u này, b ng cách ch y chể ể ứ ề ằ ạ ương trình sau:
//CT4_03.CPP // Hàm t o m c đ nhạ ặ ị
#include <conio.h>
#include <iostream.h>
class DIEM_DH {
private:
int x,y,m;
public:
// Phuong thuc void in() { cout <<"\n " << x << " "<< y<<" " << m ; }
};
void main() {
DIEM_DH d;
d.in();
DIEM_DH *p;
p= new DIEM_DH[10];
clrscr();
d.in();
for (int i=0;i<10;++i) (p+i)->in();
Trang 5}
2.2 N u trong l p đã có ít nh t m t hàm t o, ế ớ ấ ộ ạ thì hàm t o m cạ ặ
đ nh s không đị ẽ ược phát sinh n a Khi đó m i câu l nh xây d ngữ ọ ệ ự
đ i tố ượng m i đ u s g i đ n m t hàm t o c a l p N u khôngớ ề ẽ ọ ế ộ ạ ủ ớ ế
tìm th y hàm t o c n g i thì Chấ ạ ầ ọ ương trình d ch s báo l i Đi uị ẽ ỗ ề
này thường x y ra khi chúng ta không xây d ng hàm t o khôngẩ ự ạ
đ i, nh ng l i s d ng các khai báo không tham s nh ví d sau:ố ư ạ ử ụ ố ư ụ
#include <conio.h>
#include <iostream.h>
class DIEM_DH
{
private:
int x,y,m;
public:
// Phương th c dùng đ in đ i tứ ể ố ượng DIEM_DH
void in()
{
cout <<"\n " << x << " "<< y<<" " << m ;
}
//Hàm t o có đ iạ ố
DIEM_DH::DIEM_DH(int x1,int y1,int m1)
{
x=x1; y=y1; m=m1;
}
};
void main()
{
DIEM_DH d1(200,200,10); // G i t i hàm t o có đ iọ ớ ạ ố
DIEM_DH d2; // G i t i hàm t o không đ iọ ớ ạ ố d2= DIEM_DH(300,300,8); // G i t i hàm t o có đ iọ ớ ạ ố d1.in();
d2.in();
getch();
} Trong các câu l nh trên, ch có câu l nh th 2 trong hàm main()ệ ỉ ệ ứ
là b báo l i Câu l nh này s g i t i hàm t o không đ i, mà hàmị ỗ ệ ẽ ọ ớ ạ ố này ch a đư ược xây d ng.ự
Gi i pháp: ả Có th ch n m t trong 2 gi i pháp sau:ể ọ ộ ả
- Xây d ng thêm hàm t o không đ i.ự ạ ố
- Gán giá tr m c đ nh cho t t c các đ i x1, y1 và m1 c a hàmị ặ ị ấ ả ố ủ
t o đã xây d ng trên.ạ ự ở Theo phương án 2, chương trình có th s a nh sau:ể ử ư
#include <conio.h>
#include <iostream.h>
class DIEM_DH {
private:
int x,y,m;
public:
// Phương th c dùng đ in đ i tứ ể ố ượng DIEM_DH void in()
{ cout <<"\n " << x << " "<< y<<" " << m ; }
//Hàm t o có đ i , t t c các đ i đ u có giá tr m c đ nhạ ố ấ ả ố ề ị ặ ị DIEM_DH::DIEM_DH(int x1=0,int y1=0,int m1=15) {
x=x1; y=y1; m=m1;
Trang 6VT MT::tich(const VT &y)
{
VT z;
int i,j;
for (i=1; i<=n; ++i)
{
z.x[i] = 0.0 ;
for (j=1; j<=n; ++j)
z.x[i] += a[i][j]*y.x[j];
}
z.n = n;
return z;
}
MT MT::tich(const MT &b)
{
MT c;
int i,j,k;
for (i=1; i<=n; ++i)
for (j=1; j<=n; ++j)
{
c.a[i][j] = 0.0 ;
for (k=1; k<=n; ++k)
c.a[i][j] += a[i][k]*b.a[k][j];
}
c.n = n;
return c;
}
VT VT::tich(const MT &b)
{
VT z;
int i,j;
for (j=1; j<=n; ++j) {
z.x[j] = 0.0 ; for (i=1; i<=n; ++i) z.x[j] += b.a[i][j]*x[i];
} z.n = n;
return z;
} double VT::tich(const VT &y) {
double tg=0.0;
for (int i=1; i<=n; ++i)
tg += x[i]*y.x[i];
return tg;
} void main() {
MT a,b,c;
VT x,y;
clrscr();
cout << "\nMa tran A";
a.nhap();
cout << "\nMa tran B";
b.nhap();
cout << "\nMa tran C";
Trang 7cout << "\nvec to X";
x.nhap();
cout << "\nvec to Y";
y.nhap();
MT d= a.tich(b);
VT u = d.tich(y);
VT v = x.tich(c);
double s = v.tich(u);
cout << "\n\nVec to v\n"; v.in();
cout << "\n\nMa tran D"; d.in();
cout << "\n\nVec to y\n"; y.in();
cout << "\n\nS= vDy = " << s; getch();
}
236