Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

Ton t gn

Ton t gn
Bi:
Phm Vn t

Ton t gn mc nh
Ton t gn (cho lp) l mt trng hp c bit so vi cc ton t khc. Nu trong lp
cha nh ngha mt phng thc ton t gn th trnh bin dch s pht sinh mt ton
t gn mc nh thc hin cu lnh gn 2 i tng ca lp, v du:
Ht h1, h2(100,6); H1 = h2 ; // gn h2 cho h1
Ton t gn mc nh s s sao chp i tng ngun (h2) vo i tng ch (h1) theo
tng bit mt.
Trong a s cc trng hp khi lp khng c cc thnh phn con tr hay tham chiu th
ton t gn mc nh l dng v khng cn nh ngha mt phng thc ton t gn
cho lp. Nhng i vi cc lp c thuc tnh con tr nh lp dt (a thc), lp ht (hnh
trn) th ton t gn mc nh khng thch hp v vic xy dng ton t gn l cn thit.

Cch vit ton t gn


Cng ging nh cc phng thc khc, phng thc ton t gn dng i con tr this
biu th i tng ch v dng mt i tng minh biu th i tng ngun. V
trong thn ca ton t gn khng nn lm vic vi bn sao ca i tng ngun, m
phi lm vic trc tip vi i tng ngun, nn kiu i tng minh nht thit phi l
kiu tham chiu i tng.
Phng thc ton t gn c th c hoc khng c gi tr tr v. Nu khng c gi tr
tr v (kiu void), th khi vit chng trnh khng c php vit cu lnh gn lin tip
nhiu i tng, nh:
U = v = k = h ;
Nu phng thc ton t gn tr v tham chiu ca i tng ngun, th c th dng
ton t gn th thc hin cc php gn lin tip nhiu i tng.
i vi lp ht (trong mc trc), c th xy dng ton t gn nh sau:
1/4

Ton t gn

Void ht::operator=(const ht &h) { R = h.r ; m = h.m ;


Xhien = yhien = 0; Hienmh = 0 ; If (h.pht==null) Pht =
null; Else { Int size; Size = imagesize(0,0,r+r,r+r); Pht
= new char[size]; Memcpy(pht,h.pht,size); } }
Vi ton t gn ny, ch cho php gn i tng ngun cho mt i tng ch.Nh vy
cu lnh sau l sai:
Ht u, v, h ; U = v = h ;
By gi ta sa li ton gn n tr v tham chiu i tng ngun nh sau:
Const ht & ht::operator=(const ht &h) { R = h.r ; m = h.m
; Xhien = yhien = 0; Hienmh = 0 ; If (h.pht==null) pht =
null; Else { Int size; Size = imagesize(0,0,r+r,r+r); Pht
= new char[size]; Memcpy(pht,h.pht,size); } Return h ; }
Vi ton t gn mi ny, ta c th vit cu lnh gn i tng ngun cho nhiu i
tng ch. Nh vy cc cu lnh sau l c:
Ht u, v, h ; U = v = h ;

Ton t gn v hm to sao chp


+ Ton t gn khng to ra i tng mi, ch thc hin php gn gia 2 i tng
tn ti.
+ Hm to sao chp c dng to mt i tng mi v gn ni dung ca mt i
tng tn ti cho i tng mi va to.
+ Nu xy dng ton t gn m li dng hm to sao chp mc nh th cha , v
vic khi gn trong cu lnh khai bo s khng gi ti ton t gn m li gi ti hm
to sao chp.
+ Nh vy i vi lp c thuc tnh con tr, th ngoi hm to, cn xy dng thm:
- Hm hu
- Hm to sao chp
- Phng thc ton t gn

2/4

Ton t gn

Khng phi mi cu lnh cha c du = u gi n ton t gn. Cn phn bit 3


trng hp: 1. Cu lnh new (cha du =) s gi n hm to, v d:
Ht *h= new ht(50,6); // gi n hm to c i
2. Cu lnh khai bo v khi gn (dng du =) s gi n hm to sao chp, v d:
Ht k=*h; // gi n hm to sao chep
3. Cu lnh gn s gi n ton t gn, v d:
Ht u;
U=*h; // gi n phng thc ton t gn

V d minh ho
Chng trnh di y nh ngha lp ht (hnh trn) v minh ho:
+ Hm to v hm hu
+ Phng thc ton t gn c kiu tham chiu
+ Hm to sao chp
+ Cch dng con tr this trong hm to sao chp
+ Cch dng con tr _new_handler kim tra vic cp pht b nh.
//ct4_10.cpp // lop do hoa // ham huy // toan tu gan - tra
ve tham chieu // ham tao sao chep // trong ham huy co the
goi pt khac #include <conio.h> #include <iostream.h>
#include <stdlib.h> #include <graphics.h> #include <new.h>
#include <mem.h> Static void kiem_tra_bo_nho() ; Void
ktdh(); int xmax,ymax; Void kiem_tra_bo_nho() {
Outtextxy(1,1,"loi bo nho"); Getch(); Closegraph();
Exit(1); } Class ht { Private: Int r,m ; Int xhien,yhien;
Char *pht; Int hienmh; Public: Ht(); Ht(int r1,int m1=15);
Ht(const ht &h); ~ht(); Void hien(int x, int y); Void
an(); Const ht &operator=(const ht &h); }; Const ht &
ht::operator=(const ht &h) { // outtextxy(1,1,"gan");
getch(); R = h.r ; m = h.m ; Xhien = yhien = 0; Hienmh = 0
; If (h.pht==null) Pht = null; Else { Int size; Size =
3/4

Ton t gn

imagesize(0,0,r+r,r+r); Pht = new char[size];


Memcpy(pht,h.pht,size); } Return h; } Ht::ht(const ht &h)
{ //outtextxy(300,1,"constructor sao chep"); getch();
*this = h; } Ht:: ht() { R=m=hienmh=0; Xhien=yhien=0;
Pht=null; } Ht::ht(int r1,int m1) { R=r1; m=m1; hienmh=0;
Xhien=yhien=0; If (r<0) r=0; if (r==0) { Pht=null; } Else
{ Int size; char *pmh; Size = imagesize(0,0,r+r,r+r); Pmh
= new char[size]; Getimage(0,0,r+r,r+r,pmh); Setcolor(m);
Circle(r,r,r); Setfillstyle(1,m); Floodfill(r,r,m); Pht =
new char[size]; Getimage(0,0,r+r,r+r,pht);
Putimage(0,0,pmh,copy_put); Delete pmh; Pmh=null; } } Void
ht::hien(int x, int y) { If (pht!=null && !hienmh) // chua
hien { Hienmh=1; Xhien=x; yhien=y;
Putimage(x,y,pht,xor_put); } } Void ht::an() { If (hienmh)
// dang hien { Hienmh=0;
Putimage(xhien,yhien,pht,xor_put); } } Ht::~ht() { An();
If (pht!=null) { Delete pht; Pht=null; } } Void ktdh() {
Int mh=0,mode=0; Initgraph(&mh,&mode,""); Xmax =
getmaxx(); Ymax = getmaxy(); } Void main() { _new_handler
= kiem_tra_bo_nho ; Ktdh(); ht *h= new ht(50,6); // gi
hm to c i H->hien(100,200); Ht k=*h; // gi hm to
sao chp K.hien(200,200); Ht t,v,u; T = v = u = *h; // gi
ton t gn U.hien(300,200); V.hien(400,200);
T.hien(500,200); Getch(); Closegraph(); }

Vai tr ca phng thc ton t gn


Chng trnh trn s v 5 hnh trn trn mn hnh. iu g s xy ra nu b i phng
thc ton t gn v hm to sao chp?
+ Nu b c hai, th ch xut hin mt hnh trn ti v tr (100,200).
+ Nu b ton t gn (gi hm to sao chp) th ch xut hin 2 hnh trn ti cc v tr
(100,200) v (200,200).
+ Nu b hm to sao chp (gi ton t gn) th xut hin 4 hnh trn.

4/4

You might also like