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 18 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

Nội dung

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

}

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

w