توابع عملگر به عنوان اعضای کلاس يا توابع دوست

   توابع عملگر می توانند توابع عضو يا توابع غير عضو باشند، که البته توابع غير عضو معمولا به صورت توابع دوست می باشند. هنگام فراخوانی يک تابع عملگر غير عضو ، عملوند ها بايد به عنوان آرگومان به تابع فرستاده شوند.

   هنگام گرانبار کردن عملگر های () ، [] و <- يا هر عملگر انتساب ديگری، تابع گرانبار کننده عملگر بايد به عنوان يک تابع عضو تعريف شود ولی برای ساير عملگرها، تابع گرانبار کننده عملگر می تواند به صورت تابع غير عضو تعريف شود.

   هنگامی که يک تابع عملگر به عنوان يک تابع عضو تعريف می شود، عملوند سمت چپ بايد شيئی از کلاس عملگر باشدو اگر لازم است که عملوند سمت چپ شيئی از کلاس ديگری باشد، اين تابع عملگر بايد از نوع تابع غير عضو تعريف شود. تابع عملگر غير عضو در صورتی که بايد به يک عضو خصوصی (private) کلاس دسترسی داشته باشد، بايد از نوع توابع دوست (friend) تعريف گردد.

   تابع عملگر عضو کلاس تنها هنگامی فراخوانی می شود که عملوند سمت چپ عملگر دودويی (دو عملوندی) شيئی از نوع کلاس تابع عملگر باشد و يا تنها عملوند عملگر يگانی (تک عملوندی) شيئی از نوع کلاس عملگر باشد.

   دليل ديگری که ممکن است يک تابع غير عضو برای گرانبار کردن يک عملگر به کار رود اينست که بخواهيم عملگر خاصيت جابجايی داشته باشد. به عنوان مثال فرض کنيد متغيری به نام number از نوع long int داريم و شيئی با نام bigInteger1 از نوع کلاس HugeInteger (کلاسی که در آن اعداد صحيح می توانند مقادير خيلی بزرگتری نسبت به مقاديرقابل ايجاد توسط انواعی مانند long int و double داشته باشند). عملگر جمع (+) هنگام جمع يک عدد HugeInteger با يک عدد long int (مثلا در عبارت bigInteger1+number) و يا جمع يک عدد long int با يک عدد HugeInteger (مثلا در عبارت number+bigInteger1) ، شيئی موقت از نوع کلاس HugeInteger ايجاد می کند، لذا اين عملگر بايد خاصيت جابجايی داشته باشد (که معمولا عملگر جمع در عبارات محاسباتی دارای خاصيت جابجايی می باشد). در اينجا اگر عملگر جمع به صورت تابع عضو تعريف گردد، در سمت چپ آن تنها بايد شيئی از کلاس HugeInteger قرار گيرد، لذا امکان ايجاد خاصيت جابجايی در اين حالت ميسر نمی باشد، به همين دليل اين عملگر را به صورت تابع غير عضو گرانبار می کنيم تا بتوانيم خاصطت جا بجايی را به آن بدهيم.

   در زير برنامه ای آورده شده است که عمل جمع و تفريق را برای نقاط صفحه مختصات انجام می دهد. در اين برنامه عملگر تفريق به صورت تابع غير عضو دوست تعريف شده است و عملگر جمع به صورت تابع عضو تعريف شده است:

#include <iostream.h>
 
class CVector
{
  friend CVector operator- (CVector & , CVector);
 
  public:
    CVector (int =0 ,int =0 );
    CVector operator+ (CVector);
    void showCVector(void);
  private:
    int x,y;
};
 
CVector::CVector (int a, int b)
{
  x = a;
  y = b;
}
 
void CVector::showCVector(void)
{
  cout << "("<< x << "," << y << ")";
}
 
CVector CVector::operator+ (CVector vector)
{
  CVector temp;
  temp.x = x + vector.x;
  temp.y = y + vector.y;
  return temp;
}
 
CVector operator- (CVector &v, CVector vector)
{
  CVector temp;
  temp.x = v.x - vector.x;
  temp.y = v.y - vector.y;
  return temp;
}
int main ()
{
  CVector a (3,1);
  CVector b (1,2);
  CVector c,d;
  c = a + b;
  a.showCVector();
  cout << "+";
  b.showCVector();
  cout << "=";
  c.showCVector();
 
  cout << "\n";
 
  d = a - b;
  a.showCVector();
  cout << "-";
  b.showCVector();
  cout << "=";
  d.showCVector();
  return 0;
}

   خروجی برنامه به صورت زير می باشد :

(3,1)+(1,2)=(4,3)
(3,1)-(1,2)=(2,-1)
 

 

   معرفی کامپيوتروبرنامه نويسی

   ساختارهای کنترلی

   توابع

   آرايه ها

   اشاره گر ها و رشته ها

   کلاسها

   گرانبار کردن عملگر ها

 
 
 
   
 
 

حق کپی رایت محفوظ می باشد