Toán tử gán

7 448 1
Tài liệu đã được kiểm tra trùng lặp
Toán tử gán

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

Thông tin tài liệu

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 } } 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); // gọi hàm tạo có đối h->hien(100,200); HT k=*h; // gọi hàm tạo sao chép k.hien(200,200); HT t,v,u; t = v = u = *h; // gọi toán tử gán u.hien(300,200); v.hien(400,200); 192 t.hien(500,200); getch(); closegraph(); } 6.5. Vai trũ của phương thức toán tử gán Chương trỡnh trờn sẽ vẽ 5 hỡnh trũn trờn màn hỡnh. Điều gỡ sẽ xẩy ra nếu bỏ đi phương thức toán tử gán và hàm tạo sao chép? + Nếu bỏ cả hai, thỡ chỉ xuất hiờn một hỡnh trũn tại vị trớ (100,200). + Nếu bỏ toỏn tử gỏn (giữ hàm tạo sao chộp) thỡ chỉ xuất hiện 2 hỡnh trũn tại cỏc vị trớ (100,200) và (200,200). + Nếu bỏ hàm tạo sao chộp (giữ toỏn tử gỏn) thỡ xuất hiện 4 hỡnh trũn. . 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. 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

Ngày đăng: 25/10/2013, 04:20

Tài liệu cùng người dùng

Tài liệu liên quan