Toán tử con trỏ – Pointer operators
Toán tử | & * |
Có thể được thực hiện như là một hàm toàn cục không ? | Có |
Có thể được thực hiện như là một hàm thành việc của lớp không ? | Có |
Kiểu dữ liệu trả về | Bất kỳ kiểu gì |
Mặc dù có nhiều sự khác nhau, hai toán tử này được nhóm lại với nhau do ngữ cảnh sử dụng tương tự nhau. Chúng được sử dụng để tạo ra các con trỏ giả (pseudo-pointers) hoặc các con trỏ thông minh (smart pointers). Các giá trị của pseudo-pointers có thể thuộc bất kỳ kiểu dữ liệu nào (ví dụ: chúng có thể là chuỗi được sử dụng làm key trong cơ sở dữ liệu) nhưng đừng quên rằng tưởng tượng của bạn phải phù hợp với những hạn chế và ràng buộc về logic. Tốt nhất là nên đảm bảo rằng P luôn luôn bằng *&P.
Chương trình này →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <iostream> using namespace std; class P { public: int no; P(int n) : no(n) { } P() : no(0) { } string operator&() { switch(no) { case 0: return "alpha"; case 1: return "bravo"; case 2: return "charlie"; } } }; P& operator*(string s) { P *p; if(!s.compare("alpha")) p = new P(0); else if(!s.compare("bravo")) p = new P(1); else if(!s.compare("charlie")) p = new P(2); else p = new P(-1); return *p; } int main(void) { P p1(2); string s = &p1; P p2 = *s; cout << "'" << s << "' -> " << p2.no << endl; return 0; } |
cho thấy một ví dụ về việc sử dụng các toán tử này.
Phân tích cách chúng ta sử dụng chuỗi như là các pseudo-pointers. Toán tử nạp chồng ‘&’ bên trong lớp P tạo ra một “con trỏ” mới, đại diện cho một string với giá trị được lựa chọn theo giá trị của trường no, trong khi toán tử ‘*’ tạo ra một đối tượng mới dựa trên giá trị được dereferenced từ string.
Chương trình in ra dòng sau:
1 |
'charlie' -> 2 |