ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل دهم / سربارگذاری عملگر ها در++ 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

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

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

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

10 سربارگذاری عملگرهای حسابی ‐5

چهار عملگر حسابی + و – و * و / در همۀ زبا نهای برنامه نویسی وجود دارند

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

اضافه کنیم تا بتوانیم با استفاده از آن ها، اشیای ساخت خودمان را در محاسبات ریاضی

به کار ببریم.

عملگرهای حسابی به دو عملوند نیاز دارند. مثلا عملگر ضرب (*) در رابطۀ زیر:

z = x*y;

با توجه به رابطۀ فوق و آن چه در بخش قبلی گفتیم، عملگر ضرب سربارگذاری شده

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

از نوع همان کلاس داشته باشد. پس انتظار داریم قالب سربارگذاری عملگر ضرب

به شکل زیر باشد: Ratio برای کلاس

Ratio operator*(Ratio x, Ratio y)

{ Ratio z(x.num*y.num, x.den*y.den);

return z;

}

 

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

نیاز دارد. چنین تابعی نمی تواند عضوی Ratio تابع فوق به دو پارامتر از نوع کلاس

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

داشته باشد (تحقیق کنید که چرا چنین است). از T حداکثر یک پارامتر از نوع کلاس

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

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

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

به شکل زیر است: T مفروض

Class T

{ friend T operator*(const T&, const T&);

public:

// public members

private:

// private members

}

و از آ نجا که تابع دوست عضوی از کلاس نیست، تعریف بدنۀ آن باید خارج از

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

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

T operator*(const T& x, const T& y)

{ T z;

// required operations for z = x*y

return z;

}

در سربارگذاری عملگرهای حسابی + و – و / نیز از قالب های کلی فوق

استفاده می کنیم با این تفاوت که در نام تابع سربارگذاری، به جای علامت ضرب *

باید علامت عملگر مربوطه را قرار دهیم و دستورات بدنۀ تابع را نیز طبق نیاز تغییر

نشان می دهد. Ratio دهیم. مثال بعدی سربارگذاری عملگر ضرب را برای کلاس

Ratio 10 سربارگذاری عملگر ضرب برای کلاس ‐ * مثال 3

class Ratio

{ friend Ratio operator*(const Ratio&, const Ratio&);

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

public:

Ratio(int = 0, int = 1);

Ratio(const Ratio&);

Ratio& operator=(const Ratio&);

// other declarations go here

private:

int num, den;

// other declarations go here

};

Ratio operator*(const Ratio& x, const Ratio& y)

{ Ratio z(x.num * y.num , x.den * y.den);

return z;

}

int main()

{ Ratio x(22,7) ,y(-3,8) ,z;

z = x; // assignment operator is called

z.print(); cout << endl;

x = y*z; // multiplication operator is called

x.print(); cout << endl;

}

22/7

-66/56

10 سربارگذاری عملگرهای جایگزینی حسابی ‐6

به خاطر بیاورید که عملگرهای جایگزینی حسابی، ترکیبی از عملگر جایگزینی و

یک عملگر حسابی دیگر است. مثلا عملگر =* ترکیبی از دو عمل ضرب * و سپس

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

این عملگرها بر خلاف عملگرهای حسابی ساده، فقط یک عملوند دارند. پس تابع

سربارگذاری عملگرهای جایگزینی حسابی بر خلاف عملگرهای حسابی، می تواند

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

عملگر جایگزینی است. قالب کلی برای سربارگذاری عملگر =* برای کلاس مفروض

به صورت زیر است: T

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

class T

{ public:

T& operator*=(const T&);

// other public members

private:

// private members

};

بدنۀ تابع سربارگذاری به قالب زیر است:

T& T::operator*=(const T& x)

{ // required operations

return *this;

}

باعث می شود که بتوانیم عملگر =* را در یک رابطۀ *this استفاده از اشاره گر

چهار عملگر جایگزینی حسابی =+ و =- و =* و =/ C++ زنجیره ای به کار ببریم. در

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

فقط در نام تابع به جای =* باید علامت عملگر مربوطه را ذکر کرد و دستورات بدنۀ

تابع را نیز به تناسب، تغییر داد. مثال بعدی نشان می دهد که عملگر =* چگونه برای

سربارگذاری شده است. Ratio کلاس

با عملگر =* سربارگذاری شده Ratio 10 کلاس ‐ * مثال 4

class Ratio

{ public:

Ratio(int = 0, int = 1);

Ratio& operator=(const Ratio&);

Ratio& operator*=(const Ratio&);

// other declarations go here

private:

int num, den;

// other declarations go here

};

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

{ num = num*r.num;

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

den = den*r.den;

return *this;

}

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

هر دو از y و x سربارگذاری شدۀ حسابی معادلش، نتیجۀ یکسانی داشته باشد. مثلا اگر

باشند، آنگاه دو خط کد زیر باید نتیجۀ مشابهی داشته باشند: Ratio کلاس

x *= y;

x = x*y;

10 سربارگذاری عملگرهای رابطه ای ‐7

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

== و =! . این عملگرها به همان روش عملگرهای حسابی سربارگذاری می شوند،

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

عملگر رابط های باشد، همواره یک مقدار بولین است. یعنی اگر آن عبارت درست باشد،

است. چون نوع false است و اگر آن عبارت نادرست باشد، حاصل true حاصل

مقدار 1 و به true بولین در حقیقت یک نوع عددی صحیح است، می توان به جای

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

قرار داده اند. قالب کلی برای int سربارگذاری عملگرهای رابطه ای، از نوع

سربارگذاری عملگر رابط های == به شکل زیر است:

class T

{ friend int operator==(const T&, const T&);

public:

// public members

private:

// private members

}

همچنین قالب کلی تعریف بدنۀ این تابع به صورت زیر می باشد:

int operator==(const T& x, const T& y)

{ // required operations to finding result

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

return result;

}

یک مقدار بولین یا یک عدد صحیح قرار می گیرد. سایر result که به جای

عملگرهای رابطه ای نیز از قالب بالا پیروی می کنند.

Ratio 10 سربارگذاری عملگر تساوی (==) برای کلاس ‐ * مثال 5

class Ratio

{ friend int operator==(const Ratio&, const Ratio&);

frined Ratio operator*(const Ratio&, const Ratio&);

// other declarations go here

public:

Ratio(int = 0, int = 1);

Ratio(const Ratio&);

Ratio& operator=(const Ratio&);

// other declarations go here

private:

int num, den;

// other declarations go here

};

int operator==(const Ratio& x, const Ratio& y)

{ return (x.num * y.den == y.num * x.den);

}

b به صورت کسر Ratio چون اشیای کلاس

معادل x==y هستند، بررسی تساوی a

d بررسی

c

b

را (a*d==b*c) است که برای بررسی این تساوی می توانیم مقدار a ==

بررسی کنیم. بدنۀ تابع سربارگذاری در مثال بالا همین رابطه را بررسی می کند.

10 سربارگذاری عملگرهای افزایشی و کاهشی ‐8

عملگر افزایشی ++ و کاهشی -- هر کدام دو شکل دارند: شکل پیشوندی و

شکل پسوندی. هر کدام از این حالت ها را می توان سربارگذاری کرد. ابتدا سربارگذاری

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

سربارگذاری می شود.

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

وقتی که عملگر پیش افزایشی را همراه با یک شی به کار می بریم، یک واحد به

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

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

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

است. قالب کلی برای سربارگذاری عملگر پیش افزایشی به صورت زیر است:

class T

{ public:

T operator++();

// other public members

private:

// private members

};

قالب کلی برای سربارگذاری عملگر پیش افزایشی به شکل زیر است:

T T::operator++()

{ // required operations

return *this;

}

استفاده شده. علت هم این است که مشخص *this می بینید که این جا هم از اشاره گر

به کار رفته *this نیست چه چیزی باید بازگشت داده شود. به همین دلیل اشار هگر

تا شیئی که عمل پیش افزایش روی آن صورت گرفته، بازگشت داده شود. توجه کنید که

تعیین دستورات درون بدنه در اختیار ماست. لزوما این طور نیست که حتما مقدار 1 به

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

رعایت کنیم.

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

ارزیابی گردد، مقدار 1 به ++y باشد و عبارت Ratio یک شی از کلاس y اگر

یک عدد کسری است، افزودن مقدار 1 به این کسر اثر y افزوده می شود اما چون y

باشد. حالا داریم: y=22/ متفاوتی دارد. فرض کنید 7

7

29

7

1 22 7

7

22 =

+

+ + y = + =

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

num+den آن برابر با num افزایش می یابد، در اصل مقدار عضو داد های y پس وقتی

خواهد شد:

class Ratio

{ public:

Ratio(int n=0, int d=1) : num(n) , den(d) { }

Ratio operator++();

void print() { cout << num << '/' << den << endl; }

private:

int num, den;

// other declarations go here

};

int main()

{ Ratio x(22,7), y = ++x;

cout << "y = "; y.print();

cout << ", x = "; x.print();

}

Ratio Ratio::operator++()

{ num += den;

return *this;

}

y = 29/7, x = 29/7

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

نامیده می شود. ولی می دانیم که operator++ پس افزایشی شبیه هم است. هر دو

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

پارامترهای تابع پ سافزایشی یک پارامتر عجیب دارد. به قالب کلی برای تابع عملگر

پس افزایشی توجه کنید:

T operator++(int);

دارد در حالی که می دانیم هیچ مقدار int تابع پس افزایشی یک پارامتر از نوع

« پارامتر گنگ » صحیحی به این تابع ارسال نمی شود. این پارامتر را در اصطلاح

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

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

 

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

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

سایر محاسبات افزایش دهند نه پیش از آن. برای درک این موضوع به مثال بعدی توجه

کنید.

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

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

قرار بگیرد، تغییر ندهد. y را قبل از این که درون x باید طوری تعریف شود که مقدار

به شیء جاری (مالک فراخوانی) اشاره دارد. کافی است *this می دانیم که اشاره گر

مقدار این اشاره گر را در یک محل موقتی ذخیره کنیم و عمل افزایش را روی آن مقدار

تغییری *this موقتی انجام داده و حاصل آن را بازگشت دهیم. به این ترتیب مقدار

قرار می گیرد: y نمی کند و پس از شرکت در عمل جایگزینی، درون

class Ratio

{ public:

Ratio(int n=0, int d=1) : num(n) , den(d) { }

Ratio operator++(); //pre-increment

Ratio operator++(int); //post-increment

void print() { cout << num << '/' << den << endl; }

private:

int num, den;

};

int main()

{ Ratio x(22,7) , y = x++;

cout << "y = "; y.print();

cout << ", x = "; x.print();

}

Ratio Ratio::operator++(int)

{ Ratio temp = *this;

num += den;

return temp;

}

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

 

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

y = 22/7 , x = 29/7

ذکر شده ولی هیچ نامی ندارد تا operator++() پارامتر گنگ در تعریف تابع

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

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

و پ سافزایشی سربارگذاری می شوند. غیر از این ها، عملگرهای دیگری نیز مثل عملگر

خروجی (>>) ، عملگر ورودی (<<) ، عملگر اندیس ([]) و عملگر تبدیل نیز وجود

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

چون این عملگرها کاربرد کمتری دارند از توضیح آن ها خودداری می کنیم. اکنون که

C++ اصول سربارگذاری عملگرها را آموختید، می توانید با مراجعه به مراجع

سربارگذاری سایر عملگرها را تحقیق کنید.

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

پرسش های گزینه ای

1 – اگر تابعی دوست یک کلاس باشد، آنگاه:

الف – آن تابع یک عضو عمومی آن کلاس است

ب – آن تابع یک عضو خصوصی آن کلاس است

ج – آن تابع یک عضو محافظت شدۀ آن کلاس است

د – آن تابع اصلا عضوی از کلاس نیست

2 – کدام گزینه در مورد توابع دوست کلاس، صحیح است؟

الف – توابع دوست کلاس فقط اجازه دارند به اعضای عمومی کلاس دستیابی کنند

ب – توابع دوست کلاس از اعضای خصوصی کلاس محسوب می شوند

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

د – هر کلاس فقط می تواند یک تابع دوست داشته باشد

چیست؟ *this 3 – اشاره گر

الف – یک اشاره گر مخفی است که به شیئی اشاره دارد که هم اکنون عملی روی آن

صورت گرفته

ب – یک اشاره گر مخفی است که به کلاسی اشاره دارد که هم اکنون نمونه سازی شده

ج – یک اشار هگر مخفی است که به تابعی اشاره دارد که هم اکنون فراخوانی شده

د – یک اشاره گر مخفی است که به عملگری اشاره دارد که ه ماکنون اجرا شده

4 – کدام گزینه در رابطه با سربارگذاری عملگر جایگزینی صحیح نیست؟

است operator==() ، الف – نام تابع آن

ب – تابع آن، عضوی از کلاس است

ج – اگر به طور صریح ذکر نشود، آنگاه یک نسخۀ پیش فرض به کلاس اضافه می شود

د – نوع بازگشتی آن به شکل یک ارجاع است

5 – برای این که بتوانیم اشیای یک کلاس را به شکل زنجیره ای در یک عمل حسابی

شرکت دهیم باید:

الف – تابع سربارگذاری آن عمل را به شکل عضوی از کلاس اعلان کنیم

ب – پارامتر تابع سربارگذاری آن عمل را به شکل ارجاع ثابت اعلان کنیم

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

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

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

اعلان کنیم

د – بدنۀ تابع سربارگذاری آن عمل را در فایل جداگان های قرار دهیم

6 – تابع سربارگذاری عملگر پیش افزایشی باید:

الف – عضو عمومی کلاس باشد ب – عضو خصوصی کلاس باشد

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

موجود باشد. در این صورت تابع Date 7 – فرض کنید که کلاس مفروض

باید: operator<(const Date&, const Date&)

الف – عضو عمومی کلاس باشد ب – عضو خصوصی کلاس باشد

ج – دوست کلاس باشد د – تابع دستیابی باشد

موجود باشد. در این صورت تابع Person 8 – فرض کنید که کلاس مفروض

چه چیزی را سربارگذاری می کند؟ Person operator--(int);

الف – عملگر پیش کاهشی را سربارگذاری می کند

ب – عملگر پس کاهشی را سربارگذاری می کند

ج – عملگر ایندکس را سربارگذاری می کند

د – عملگر خروجی را سربارگذاری می کند

9 – تفاوت بین عملگرهای سربارگذاری شدۀ پیش افزایشی و پ سافزایشی در چیست؟

الف – تابع سربارگذاری عملگر پیش افزایشی، عضو کلاس است ولی تابع سربارگذاری

عملگر پس افزایشی عضو کلاس نیست

ب – تابع سربارگذاری عملگر پیش افزایشی دوست کلاس است ولی تابع سربارگذاری

عملگر پس افزایشی دوست کلاس نیست

ج – تابع سربارگذاری عملگر پس افزایشی پارامتر گنگ دارد ولی تابع سربارگذاری

عملگر پیش افزایشی پارامتر گنگ ندارد

دارد ولی تابع سربارگذاری *this د – تابع سربارگذاری عملگر پ سافزایشی اشاره گر

ندارد *this عملگر پیش افزایشی اشاره گر

10 – نوع بازگشتی از تابع سربارگذاری عملگرهای رابط های چیست؟

float – د double – ج char – ب int – الف

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

پرسش های تشریحی

چگونه استفاده می شود؟ operator 1‐ کلمۀ کلیدی

به چه چیزی اشاره می کند؟ *this 2‐ اشاره گر

را نمی توان برای توابع غیر عضو استفاده کرد؟ *this 3‐ چرا اشار هگر

را برمی گرداند؟ *this ، 4‐ چرا عملگر جایگزینی سربازگذاری شده

5‐ نتیجۀ اعلان های زیر چه تفاوتی با هم دارد ؟

Ratio y(x);

Ratio y = x;

6‐ نتیجۀ دو سطر زیر چه تفاوتی با هم دارد؟

Ratio y = x;

Ratio y; y = x;

7‐ چرا نمی توان ** را به عنوان عملگر توان سربارگذاری کرد؟

8‐ چرا عملگرها ی حسابی + و - و * و / باید به صورت توابع دوست سربارگذاری

شوند؟

10 ‐ چگونه تعریف عملگر پی شافزایشی سربارگذاری شده از عملگر پ سافزایشی

سربارگذاری شده تشخیص داده می شود؟

در پیاد هسازی عملگر پیش افزایشی بدون نام است؟ int 11 ‐ چرا آرگومان

تمرین های برنامه نویسی

را با یک سازندۀ پیش فرض، یک سازندۀ کپی، یک نابودکننده و Vector 1‐ کلاس

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

کنید. هر شی از این کلاس، یک بردار را نشان می دهد.

پیاده سازی کنید. Ratio 2‐ عملگرهای تقسیم و جمع را برای کلاس

سربارگذاری Ratio 3‐ عملگرهای حسابی پیش کاهشی و پس کاهشی را برای کلاس

کنید.

سربارگذاری Ratio 4‐ عملگرهای جایگزینی حسابی =/ و =- را برای کلاس

سربارگذاری کنید. Ratio کنید. 5‐ عملگرهای رابطه ای < و =! را برای کلاس

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

6‐ تحقیق کنید که غیر از عملگرهای ذکر شده در این فصل، کدام عملگرها را می توان

برای یک کلاس سربارگذاری کرد. به دلخواه یکی از آن عملگرها را برای C++ در

سربارگذاری کنید. Ratio کلاس

مسألۀ 3 فصل 9) عملگرهای حسابی + و – و همچنین ) Time 7‐ برای کلاس

عملگرهای رابطه ای == و > و < را سربارگذاری کنید.

مسألۀ 6 فصل 9) عملگرهای حسابی – و * را ) Matrix 8 – برای کلاس

سربارگذاری کنید.

مسألۀ 7 فصل 9) عملگرهای حسابی + و / را ) Point 9 – برای کلاس

سربارگذاری کنید.

mo-mah.persianblog.ir

mohsen_mahyar@yahoo.com

 

   + MOHSEN GHASEMI - ۱٢:٢٦ ‎ق.ظ ; ۱۳۸٩/٥/٢٥