1. Trang chủ
  2. » Cao đẳng - Đại học

Lập trình hướng đối tượng - Hàm tạo, hàm hủy và các vấn đê liên quan

7 20 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 115,64 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

[r]

Trang 1

Ch ươ 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 3

V 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 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]; // 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 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";

Trang 7

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();

}

236

Ngày đăng: 10/03/2021, 14:05

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w