عملگر دسترسی کلاس (<‒) را میتوان با احتیاط بیشتر اورلود کرد. این عملگر تعریف میشود تا به کلاس، رفتاری شبیه یک اشارهگر اعطا کند. عملگر <‒ باید یک تابع عضو باشد. در صورت استفاده، نوع داده بازگشتی آن باید اشارهگری به یک شی از همان کلاسی باشد که عملگر به آن اشاره میکند.
عملگر <‒ اغلب همراه با عملگر درفرنس اشارهگر (pointer-dereference) * ، برای پیاده سازی «اشارهگرهای هوشمند» (smart pointers) به کار میرود. این اشارهگرها اشیایی هستند که همانند اشیا معمولی رفتار میکنند با این تفاوت که هنگام دسترسی به یک شی از طریق آنها، عملیات دیگری نیز انجام میگیرد، مانند حذف خودکار شی هنگام تخریب اشارهگر یا هنگامی که اشارهگر به شی دیگر منتقل میشود.
عملگر درفرنس <‒ را میتوان به صورت یک عملگر یگانی پسوندی (postfix) تعریف کرد. یعنی، با داشتن کلاس.
class Ptr { //... X * operator->(); };
از اشیا کلاس Ptr میتوان برای دسترسی به اعضای کلاس X ، مانند یک اشارهگر بهره برد. برای مثال:
void f(Ptr p ) { p->m = 10 ; // (p.operator->())->m = 10 }
دستور p->m به عبارت (()<‒p.operator) ترجمه میشود. مثال زیر از همین مفهوم استفاده میکند تا نحوه اورلود کردن اشارهگر <‒ را توضیح دهد.
#include <iostream> #include <vector> using namespace std; // Consider an actual class. class Obj { static int i, j; public: void f() const { cout << i++ << endl; } void g() const { cout << j++ << endl; } }; // Static member definitions: int Obj::i = 10; int Obj::j = 12; // Implement a container for the above class class ObjContainer { vector<Obj*> a; public: void add(Obj* obj) { a.push_back(obj); // call vector's standard method. } friend class SmartPointer; }; // implement smart pointer to access member of Obj class. class SmartPointer { ObjContainer oc; int index; public: SmartPointer(ObjContainer& objc) { oc = objc; index = 0; } // Return value indicates end of list: bool operator++() { // Prefix version if(index >= oc.a.size()) return false; if(oc.a[++index] == 0) return false; return true; } bool operator++(int) { // Postfix version return operator++(); } // overload operator-> Obj* operator->() const { if(!oc.a[index]) { cout << "Zero value"; return (Obj*)0; } return oc.a[index]; } }; int main() { const int sz = 10; Obj o[sz]; ObjContainer oc; for(int i = 0; i < sz; i++) { oc.add(&o[i]); } SmartPointer sp(oc); // Create an iterator do { sp->f(); // smart pointer call sp->g(); } while(sp++); return 0; }
با اجرای این کد، خروجی زیر حاصل میشود.
10 12 11 13 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21
منبع: ترجمه از سایت tutorialspoint.com
در جلسه بعدی آموزش ++C با ما همراه باشید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.