فصل دهم / سربارگذاری عملگر ها در++ C

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

C++ فصل دهم / سربارگذاری عملگر ها در

نیست بلکه دوست آن است. Ratio عضو کلاس numReturn() در کد بالا تابع

برای این که یک تابع را دوست یک کلاس معرفی کنیم، آن تابع را در کلاس مذکور

در اعلان آن استفاده می کنیم. توابع دوست باید friend اعلان کرده و از کلمۀ کلیدی

قبل از اعضای عمومی و خصوصی کلاس اعلان شوند و تعریف آ نها باید خارج از

کلاس و به شکل یک تابع معمولی باشد زیرا تابع دوست، عضو کلاس نیست. توابع

دوست بیشتر در سربارگذاری عملگرها به کار گرفته می شوند.

10 سربارگذاری عملگر جایگزینی (=) ‐3

در بین عملگرهای گوناگون، عملگر جایگزینی شاید بیشترین کاربرد را داشته

باشد. هدف این عملگر، کپی کردن یک شی در شیء دیگر است. مانند سازندۀ

پیش فرض، سازندۀ کپی و نابودکننده، عملگر جایگزینی نیز به طور خودکار برای یک

کلاس ایجاد می شود اما این تابع را می توانیم به شکل صریح درون کلاس اعلان نماییم.

Ratio 10 افزودن عملگر جایگزینی به کلاس ‐ * مثال 1

است که شامل سازندۀ پیش فرض، Ratio کد زیر یک رابط کلاس برای

سازندۀ کپی و عملگر جایگزینی می باشد:

class Ratio

{ public:

Ratio(int = 0, int = 1); // default constructor

Ratio(const Ratio&); // copy constructor

void operator=(const Ratio&); // assignment operator

// other declarations go here

private:

int num, den;

};

است و operator= ، به نحو اعلان عملگر جایگزینی دقت نمایید. نام این تابع عضو

فهرست آرگومان آن مانند سازندۀ کپی می باشد یعنی یک آرگومان منفرد دارد که از نوع

همان کلاس است که به طریقۀ ارجاع ثابت ارسال می شود. عملگر جایگزینی را

می توانیم به شکل زیر تعریف کنیم:

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

340 برنامه سازی پیشرفته

void Ratio::operator=(const Ratio& r)

{ num = r.num;

den = r.den;

}

را به درون اعضای داده ای شیئی که مالک فراخوانی r کد فوق اعضای داده ای شیء

باشند، کد Ratio دو شی از کلاس y و x این عملگر است، کپی می کند. حالا اگر

با تعاریف بالا به درستی کار می کند ولی این هنوز کافی نیست. x=y;

this 10 اشاره گر ‐4

می توانیم عملگر جایگزینی را به شکل زنجیره ای مثل زیر به کار ببریم: C++ در

x = y = z = 3.14;

قرار z اجرای کد بالا از راست به چپ صورت می گیرد. یعنی ابتدا مقدار 3.14 درون

قرار داده x درون y کپی می شود و سرانجام مقدار y درون z می گیرد و سپس مقدار

می شود. عملگر جایگزینی که در مثال قبل ذکر شد، نمی تواند به شکل زنجیره ای به کار

رود. به برهان زیر توجه کنید:

x=y=z از یک کلاس باشند و در جایگزینی z و y و x فرض کنیم سه شیء

می نویسیم. عبارت داخل x=(y=z) شرکت کنند. جایگزینی مفروض را به شکل

است. مشخص x=f(y,z) پرانتز را می توانیم یک تابع تصور کنیم. پس در حقیقت

همان تابع عملگر f باشد. چون تابع x باید دارای نوع بازگشتی از نوع f است که تابع

جایگزینی است، نتیجه می شود که عملگر جایگزینی باید یک مقدار بازگشتی از نوع

همان کلاس داشته باشد. اما این مقدار بازگشتی چیست؟ عملگر جایگزینی یک شی را

درون شیء دیگر کپی می کند و چیزی برای بازگرداندن باقی نمی ماند.

مساله را حل می کند. این اشار هگر مخفی، همیشه به شیئی اشاره this اشاره گر

می کند که الان روی آن عملی صورت گرفته است. مقدار بازگشتی از عملگر

است که به شیئی که الان مقداری در آن کپی شده this جایگزینی، همین اشار هگر

اشاره دارد. این مقدار می تواند در جایگزینی بعدی از زنجیره به کار گرفته شود. اکنون

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

فصل دهم / سربارگذاری عملگر ها 341

می توانیم عملگر جایگزینی را به شکل کامل سربارگذاری کنیم. الگوی کلی برای

به شکل زیر است: T سربارگذاری عملگر جایگزینی در کلاس مفروض

T& operator=(const T&);

به صورت زیر T همچنین الگوی کلی تعریف عملگر جایگزینی برای کلاس مفروض

است:

T& T::operator=(const T& t)

{ // assign each member datum of t to the corresponding

// member datum of the owner

return *this;

}

که به جای دو خط توضیحی در کد فوق، دستورات لازم و مورد نیاز قرار می گیرد. مثال

را نشان می دهد. Ratio بعدی عملگر جایگزینی سربارگذاری شدۀ کامل برای کلاس

10 سربارگذاری عملگر جایگزینی به شکل صحیح ‐ * مثال 2

class Ratio

{ public:

Ratio(int =0, int =1); // default constructor

Ratio(const Ratio&); // copy constructor

Ratio& operator=(const Ratio&); // assignment operator

// other declarations go here

private:

int num, den;

// other declarations go here

};

Ratio& Ratio::operator=(const Ratio& r)

{ num = r.num;

den = r.den;

return *this;

}

می توانند در یک جایگزینی زنجیره ای شرکت کنند: Ratio حالا اشیای کلاس

 

342 برنامه سازی پیشرفته

Ratio x, y, z(22,7);

x = y = z;

توجه داشته باشید که عمل جایگزینی با عمل مقداردهی تفاوت دارد، هر چند

هر دو از عملگر یکسانی استفاده می کنند. مثلا در کد زیر:

Ratio x(22,7); // this is an initialization

Ratio y(x); // this is an initialization

Ratio z = x; // this is an initialization

Ratio w;

w = x; // this is an assignment

سه دستور اول، دستورات مقداردهی هستند ولی دستور آخر یک دستور جایگزینی

است. دستور مقداردهی، سازندۀ کپی را فرا می خواند ولی دستور جایگزینی عملگر

جایگزینی را فراخوانی می کند.

/ 1 نظر / 221 بازدید
راحیل

واااااااااااااااااااااااااای مرسی از توضیحاتتون دستتون درد نکنه بسیار کمک کرد این استاد کشت ما را از بس تکالیف عجیب غریب خواست