[r]
(1)Chương 4
Hàm t o, hàm hu cácạ ỷ v n đ liên quanấ ề
Chương trình b y m t s v n đ có tính chun sâu h n vầ ộ ố ấ ề ề
l p nh :ớ
+ Hàm t o (constructor)ạ
+ Hàm hu (destructor)ỷ
+ Toán t gán hàm t o chépử
+ M i liên quan gi a hàm t o đ i tố ữ ố ượng thành ph n ầ
+ Các thành ph n tĩnhầ
+ L p b n, hàm b ạ
+ Đ i tố ượng h ngằ
+ Phương th c inlineứ
§ Hàm t o (constructor)ạ 1.1 Công d ngụ
Hàm t o m t phạ ộ ương th c c a l p (nh ng đ ủ ặ
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 thu c tính c a đ i tạ ẽ ị ộ ủ ố ượng
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ế ạ
1.2.1 Đi m khác c a hàm t o phể ủ ạ ương th c thôngứ thường
Khi vi t hàm t o c n đ ý 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 c a hàm t o phự ố ủ ạ ương th c thơngứ thường
Ngồ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 ho c bên đ 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ó thu cị ể ộ
tính:
int x; // hồnh đ (c t) c a mộ ộ ủ ể
int y; // tung đ (hàng) c a mộ ủ ể
int m; // m u c a mầ ủ ể
và đ a vào hàm t o đ kh i gán cho thu c tính c a l p:ư ể ộ ủ
// Hàm t o không đ i: Dùng giá tr c đ nh đ kh i gán cho ố ị ố ị ể
// x, y, m DIEM_DH() ;
// Hàm t o có đ i: Dùng đ 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:
(2)//Hàm t o không đ i: kh i gán cho x=0, y=0, m=1ạ ố
// Hàm vi t bên đ nh nghĩa l pế ị
DIEM_DH() {
x=y=0; m=1; }
// Hàm t o xây d ng bên đ 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 đ nh nghĩa l pự ị
DIEM_DH:: DIEM_DH(int x1, int y1, int m1) {
x=x1; y=y1; m=m1; }
1.3 Dùng hàm t o khai báo ạ
+ Khi xây d ng hàm t o, ta có th dùnự ể g chúng khai báo đ t o m t đ i tể ộ ố ượng đ ng th i kh i gán cho thu c tínhồ ộ
c a đ i tủ ố ượng đượ ạc t o D a vào tham s khai báo màự ố
Trình biên d ch s bi t c n g i đ n hàm t o ị ẽ ế ầ ọ ế
+ Khi khai báo m t bi n đ i tộ ế ố ượng có th s d ng tham sể ụ ố
đ kh i gán cho 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 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 ố ầ
Chú ý: V i hàm có đ i ki u l p, đ i ch xem thamớ ố ể ố ỉ
s hình th c, v y khai báo đ i (trong dòng đ u c a hàm) số ứ ậ ố ầ ủ ẽ
không t o đ i tạ ố ượng m i khơng g i t i hàm t o.ớ ọ
1.4 Dùng hàm t o c p phát b nhạ ấ ộ ớ
+ Khi c p phát b nh cho m t đ i tấ ộ ộ ố ượng có th dùng thamể
s đ kh i gán cho 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 đ i tạ ể ể ễ ố ượng h ng ằ
+ Nh bi t, sau kư ế hi đ nh nghĩa l p DIEM_DH có th xemị ể
l p nh m t ki u d li u nh int, double, char, ộ ể ữ ệ
(3)V i ki u int có h ng int, nh 356.ớ ể ằ
V i ki u double 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 g i: Đ i tọ ố ượng h ng) 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ó 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 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 minh ho cách xây d ng hàm t o cáchạ ự
s dùng hàm t o khai báo, c p phát b nh trongử ấ ộ
vi c bi u di n 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 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ọ ố
(4)DIEM_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]; // 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(); }
§ L p khơng có hàm t o hàm t o m c đ nhớ ạ ạ ặ ị
Các chương trình nêu chương đ u khơng có hàm t o.ề
V y đ i tậ ố ượng hình thành nh th ?ư ế
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 th c ch tộ ặ ị ố ự ấ
khơng làm c Nh v y m t đ i tả ậ ộ ố ượng t o ch đạ ỉ ược c p phátấ
b nh , cịn thu c tính c a ch a độ ộ ủ ược xác đ nh Chúng ta cóị
th ki m ch ng 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();
(5)getch(); }
2.2 N u l p có nh t m t hàm t o,ế ớ ấ ộ ạ 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 Chấ ầ ọ ương trình d ch s báo l i Đi uị ẽ ỗ ề
này thường x y không xây d ng hàm t o khôngẩ ự
đ i, nh ng l i s d ng 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âu l nh trên, ch có câu l nh th hàm main()ệ ỉ ệ ứ
là b báo l i Câu l nh 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 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 đ i x1, y1 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 đ 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;
(6)VT 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";
(7)c.nhap();
cout << "\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();
}