Việc chuyển đổi một đối tượng thuộc kiểu này thành một đối tượng kiểu khác tỏ ra hữu ích trong một số trường hợp. Có thể sử dụng quá tải toán tử để thực hiện việc chuyển đổi, nhưng cách sử dụng hàm chuyển kiểu là một giải pháp dễ dàng và hay hơn.
Một hàm chuyển kiểu thực hiện tự động việc chuyển đổi một đối tượng thành một giá trị tương thích với kiểu của biểu thức mà đối tượng đó có tham gia.
Dạng tổng quát
operator type() { return value; } type là kiểu cần chuyển
value là gía trị của đối tượng sau khi được chuyển Hàm sẽ trả về gía trị thuộc kiểu type.
Hàm chuyển kiểu không có tham số và nó phải là hàm thành phần của lớp trong đó
hàm thực hiện việc chuyển kiểu.
Hàm chuyển kiểu cung cấp một cách tiếp cận sáng sủa hơn cho việc chuyển kiểu của đối tượng so với các phương pháp của C++, bởi vì nó cho phép một đối tượng được sử dụng trực tiếp trong biểu thức thuộc kiểu cần chuyển đến.
Ví dụ 6.1 Lớp coord có một hàm chuyển kiểu thành kiểu nguyên. Hàm trả về gía trị tích của hai toạ độ
// A simple conversion function example. #include <iostream.h>
class coord { int x, y; public:
coord(int i, int j) { x = i; y = j; }
};
int main() {
coord o1(2, 3), o2(4, 3); int i;
i = o1; // automatically convert to integer cout << i << '\n'; cout << i << '\n';
i = 100 + o2; // convert o2 to integer cout << i << '\n'; cout << i << '\n';
return 0; }
@ Bằng cách dùng hàm chuyển kiểu, các lớp tự tạo được hoà nhập vào trong một biểu thức thông thường của C++ mà không cần phải sử dụng một mảng các toán tử qúa tải rất phức tạp.
Ví dụ 6.2 Lớp strtype có một hàm chuyển kiểu chuyển chuổi ký tự thành một con trỏ đến chuổi str #include <iostream.h> #include <string.h> class strtype { char str[80]; int len; public:
strtype(char *s) { strcpy(str, s); len = strlen(s); }
operator char *() { return str; } // convert to char* };
int main() {
strtype s("This is a test\n"); char *p, s2[80];
p = s; // convert to char *
cout << "Here is string: " << p << '\n'; // convert to char * in function call
strcpy(s2, s);
cout << "Here is copy of string: " << s2 << '\n'; return 0;
}
@ Hàm chuyển kiểu không chỉ được gọi khi đối tượng s bị gán cho con trỏ p, mà còn được gọi khi đối tượng s được dùng như một tham số của hàm strcpy() có dạng
char *strcpy(char *s1, char *s2) ;
Vì s2 có kiểu char *, nên hàm chuyển kiểu thành char * sẽ được gọi thực thi một cách tự động.
@ Như vậy hàm chuyển kiểu có thể giúp lập trình viên tích hợp các lớp tự tạo vào thư viện hàm chuẩn của C++ một cách êm thấm.
Bài tập VI
1. Qua lớp strtype trong ví dụ 7.2 chương 10, viết chương trình tạo ra một hàm chuyển sang kiểu nguyên. Hàm sẽ trả về gía trị là chiều dài của chuỗi ký tự str. 2. Cho một lớp sau
class pwr {
int base;
int exp;
public:
pwr(int b, int e) {base = b; exp = e;} // create conversion to integer here };
Hãy tạo ra một hàm chuyển một đối tượng kiểu pwr thành kiểu nguyên. Hàm sẽ trả về gía trị của biến base.