khai báo const phía sau)
- C++ còn cho phép tạo ra các hàm thành phần đặc biệt khác để xử lý đối tợng hằng. Khi đó hàm thành phần này phải đợc khai báo từ khoá const ở cuối khai báo hàm và nó đợc gọi là hàm thành phần const
{ // nội dung hàm }
- Hàm thành phần const chỉ để xử lý các đối tợng const,
- Vì lý do đó nên ta có các kết quả sau đây:
(1) Hàm thành phần const không đợc thay đổi nội
dung của đối tợng trong thân hàm.
(2) Hàm thành phần const có thể định nghĩa chồng
bằng một hàm thành phần khác không phải là hàm thành phần const.
Khi đó, có thể "chuyên môn hoá" các hàm định nghĩa chồng. Các hàm thành phần const để làm việc với các đối tợng const, các hàm thành phần không phải là const để làm việc trên các đối tợng không phải là const.
* So sánh 2 ví dụ sau đây Ví dụ 3a #include <iostream.h> #include <conio.h> class ABC { int x; public: ABC(int x1) {x=x1;}
int get_x(void) const { return x; } int get_x(void)
{int x1; cout<<"x = "; cin>>x1; x=x1; return x;} void show_x(void) {cout<<"x= "<<x<<endl;} };
int main() { clrscr(); ABC a(5); a.show_x();
cout<<"? x= "<<a.get_x()<<endl; getche(); return 0;}
Ví dụ 3b #include <iostream.h> #include <conio.h> Kết quả x=5 x= 7 ↵ ? x=7 Kết quả x=5 ? x=5
class ABC { int x; public:
ABC(int x1) {x=x1;}
int get_x(void) const { return x; } int get_x(void)
{int x1; cout<<"x = "; cin>>x1; x=x1; return x;} void show_x(void) const
{cout<<"x= "<<x<<endl;} };
int main() { clrscr();
const ABC a(5); a.show_x();
cout<<"? x= "<<a.get_x()<<endl; getche(); return 0;}
So sánh:
- Trong ví dụ 3a, đối tợng a không phải là đối tợng hằng nên lệnh a.get_x() sẽ gọi hàm thành thành phần get_x() mà không phải là hàm thành phần const, nghĩa là gọi hàm:
int get_x(void)
{int x1; cout<<"x = "; cin>>x1; x=x1; return x;} và cho nhập giá trị của x. Tất nhiên nếu không khai báo hàm này thì chơng trình sẽ cho thực hiện hàm: int get_x(void) const { return x; }
- Trong ví dụ 3b, đối tợng a là một đối tợng hằng nên lệnh a.get_x() sẽ gọi hàm thành phần const
int get_x(void) const { return x; }
và không cho nhập giá trị x vì không cho phép thay đổi nội dung đối tợng hằng. Trong trờng hợp này, để làm việc với đối tợng const a thì hàm show_x() cũng phải đợc khai báo là const. Vậy để chơng trình 3b trở nên tổng quát
thì hoặc ta không khai báo hàm thành phần const hoặc ta phải có đầy đủ 2 hàm show_x() (định nghĩa chồng) một hàm thành phần const còn hàm kia không là const.
Ta có 3 kết quả tiếp theo:
(3) Hàm thành phần const không đợc gọi một hàm
thành phần khác không phải là const.
(4) Không đợc gọi các hàm thành phần không phải
const từ các đối tợng const. (xem ví dụ 3b)
(5) Lời khuyên: nên khai báo các hàm thành phần
const khi chỉ để sử dụng các đối tợng const.