Tải bản đầy đủ (.docx) (7 trang)

Toán tử gán

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (64.57 KB, 7 trang )

Toán tử gán
6.1. Toán tử gán mặc định
Toán tử gán (cho lớp) là một trường hợp đặc biệt so với các toán tử khác. Nếu trong lớp
chưa định nghĩa một phương thức toán tử gán thỡ Trỡnh biờn dịch sẽ phỏt sinh một toỏn
tử gỏn mặc định để thực hiện câu lệnh gán 2 đối tượng của lớp, ví du:
HT h1, h2(100,6);
h1 = h2 ; // Gán h2 cho h1
Toán tử gán mặc định sẽ sẽ sao chép đối tượng nguồn (h2) vào đối tượng đích (h1) theo
từng bit một.
Trong đa số các trường hợp khi lớp không có các thành phần con trỏ hay tham chiếu thỡ
toỏn tử gỏn mặc định là đủ dùng và không cần định nghĩa một phương thức toán tử gán
cho lớp. Nhưng đối với các lớp có thuộc tính con trỏ như lớp DT (đa thức), lớp HT (hỡnh
trũn) thỡ toỏn tử gỏn mặc định không thích hợp và việc xây dựng toán tử gán là cần thiết.
6.2. Cách viết toán tử gán
Cũng giống như các phương thức khác, phương thức toán tử gán dùng đối con trỏ this để
biểu thị đối tượng đích và dùng một đối tường minh để biểu thị đối tượng nguồn. Vỡ trong
thõn của toỏn tử gỏn khụng nờn làm việc với bản sao của đối tượng nguồn, mà phải làm
việc trực tiếp với đối tượng nguồn, nên kiểu đối tường minh nhất thiết phải là kiểu tham
chiếu đối tượng.
Phương thức toán tử gán có thể có hoặc không có giá trị trả về. Nếu không có giá trị trả
về (kiểu void), thỡ khi viết chương trỡnh khụng được phép viết câu lệnh gán liên tiếp nhiều
đối tượng, như:
u = v = k = h ;
Nếu phương thức toán tử gán trả về tham chiếu của đối tượng nguồn, thỡ cú thể dựng
toỏn tử gỏn thể thực hiện cỏc phộp gỏn liờn tiếp nhiều đối tượng.
Ví dụ đối với lớp HT (trong mục trước), có thể xây dựng toán tử gán như sau:
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);
}
}
Với toán tử gán này, chỉ cho phép gán đối tượng nguồn cho một đối tượng đích.
Như vậy câu lệnh sau là sai:
HT u, v, h ;
u = v = h ;
Bây giờ ta sửa lại toán gán để nó trả về tham chiếu đối tượng nguồn 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 ;

}
Với toán tử gán mới này, ta có thể viết câu lệnh để gán đối tượng nguồn cho nhiều đối
tượng đích. Như vậy các câu lệnh sau là được:
HT u, v, h ;
u = v = h ;
6.3. Toán tử gán và hàm tạo sao chép
+ Toán tử gán không tạo ra đối tượng mới, chỉ thực hiện phép gán giữa 2 đối tượng đó
tồn tại.
+ Hàm tạo sao chép được dùng để tạo một đối tượng mới và gán nội dung của một đối
tượng đó tồn tại cho đối tượng mới vừa tạo.
+ Nếu đó xõy dựng toỏn tử gỏn mà lại dựng hàm tạo sao chộp mặc định thỡ chưa đủ, vỡ
việc khởi gỏn trong cõu lệnh khai bỏo sẽ khụng gọi tới toỏn tử gỏn mà lại gọi tới hàm tạo
sao chộp.
+ Như vậy đối với lớp có thuộc tính con trỏ, thỡ ngoài hàm tạo, cần xõy dựng thờm:
- Hàm huỷ
- Hàm tạo sao chép
- Phương thức toán tử gán
186
Chỳ ý: Không phải mọi câu lệnh chứa có dấu = đều gọi đến toán tử gán. Cần phân biệt 3
trường hợp:
1. Câu lệnh new (chứa dấu =) sẽ gọi đến hàm tạo, ví dụ:
HT *h= new HT(50,6); // gọi đến hàm tạo có đối
2. Câu lệnh khai báo và khởi gán (dùng dấu =) sẽ gọi đến hàm tạo sao chép, ví dụ:
HT k=*h; // gọi đến hàm tạo sao chep
3. Câu lệnh gán sẽ gọi đến toán tử gán, ví dụ:
HT u;
u=*h; // gọi đến phương thức toán tử gán
6.4. Ví dụ minh hoạ
Chương trỡnh dưới đây định nghĩa lớp HT (hỡnh trũn) và minh hoạ:
+ Hàm tạo và hàm huỷ

+ Phương thức toán tử gán có kiểu tham chiếu
+ Hàm tạo sao chép
+ Cách dùng con trỏ this trong hàm tạo sao chép
+ Cách dùng con trỏ _new_handler để kiểm tra việc cấp phát 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);
}
188
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 = 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);
190

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×