khai báo const phía trớc)
- Ta đã biết con trỏ this dùng để thay thế đối tợng ẩn từ đó truy nhập tới các thành phần của lớp một cách t- ờng minh. Ví dụ về các constructor của lớp, về các toán tử tải bội không thân thiện chỉ có thể giải thích bằng con trỏ this.
- Xét một hàm thành phần của lớp có tham số là một đối tợng kiểu const. Hàm này phải trả lại địa chỉ của: hoặc đối tợng const truyền vào hàm hoặc chính đối tợng ẩn (đối tợng gọi hàm) tức là con trỏ this. Nh vậy chung quy là hàm trả về địa chỉ của đối tợng nhng hoặc đối tợng const hoặc đối tợng không const. Mặt khác nhận kết quả trả lại từ hàm (tức là vế trái của phép gán) lại là một đối tợng không const. Ta thấy ở đây con trỏ this phải đợc chuyển đổi kiểu từ không const sang kiểu const và ngợc lại. Trong trờng hợp này C++ yêu cầu phải nói rõ đợc phép đổi kiểu của con trỏ this bằng cách viết từ khoá const trớc khi khai báo hàm thành phần.
class class_name {....
const fun_name(const class_name &); ... };
- Tóm lại từ khoá const đặt trớc khai báo hàm thành phần là để báo hiệu đợc phép chuyển kiểu của con trỏ this truyền cho hàm thành phần hoặc trả lại từ hàm thành phần.
Ví dụ 4 (const4.cpp) #include <iostream.h> #include <conio.h> class ABC { int v; public: ABC() {} ABC(int v1) {v=v1;}
void nhap(void){int v1; cout<<"v= "; cin>>v1;v=v1;} const ABC& lonhon(const ABC&);
void xem(void) const {cout<<"value = "<<v<<endl;} };
const ABC& ABC::lonhon(const ABC &m) { if(v<m.v) return m;
else return *this;}
int main() { clrscr();
ABC a(5),b(9);
cout<<"doi tuong a: "; a.xem(); cout<<"doi tuong b: ";b.xem(); ABC c;
c=a.lonhon(b);
cout<<"doi tuong c: ";c.xem(); getche();
return 0; }
a) Nếu trong hàm
const ABC& ABC::lonhon(const ABC &m)
ta bỏ đi từ khoá const trớc khai báo hàm, C++ sẽ thông báo lỗi:
reference initialized with 'const ABC', needs lvalue of type ABC
b) Nếu ta thay đối tợng c bằng một đối tợng hằng const ABC c;
thì hàm lonhon(ABC&) phải là một hàm thành phần const, vì nó làm việc với đối tợng hằng (trả lại một đối tợng hằng cho c)
Trong trờng hợp này, ta phải khai báo kết hợp const ABC& ABC::lonhon(const ABC &m)const; Kết luận
1. Khai báo const trong tham số của hàm để quy định không đợc phép thay đổi tham số đó trong hàm.
2. Hàm thành phần const (khai báo const sau khai báo hàm) chỉ làm làm việc với các đối tợng hằng.
3. Khai báo const trớc khai báo của hàm thành phần để cho phép đổi kiểu của con trỏ this trả lại từ hàm thành phần đó.