PDA

View Full Version : سوال: دلیل تعریف مقدار بازگشتی Operator ها از نوع Reference هنگام Overload کردن



***BiDaK***
چهارشنبه 29 آذر 1391, 01:52 صبح
سلام.من واسم سوال پیشومده که چرا باید مثلا تو این کدهای زیر که واسه کلاس =+ هست از پویتر استفاده بشه:


thing& thing::operator+=(thing& t)
{
something += t.something;
return *this;
}

آخه جفت اینا اگه پوینتر نباشه یعنی هم thing& و هم پروتوتایپ (thing& t) مشکلی پیش نمیاد.
حالا توو معرفی داخل مین هم اینجوری مثلا معرفی شده:


thing a(10);
thing b(20);

خوب تو مین هم که پوینتر معرفی نشدن که بخواد کلاس پوینتر باشه...دلیلش چیه؟؟
چرا باید خروجی تابع پوینتر باشه.اگه نباشه هم جواب درست میداد.حالا چرا باشه؟
اگه یکی قشنگو واضح با مثال واسم بگه خیلی ممنون میشه که جریان این پوینتر گرفتن اینجا چیه.:خجالت:

mehdi.mousavi
چهارشنبه 29 آذر 1391, 06:40 صبح
سلام.من واسم سوال پیشومده که چرا باید مثلا تو این کدهای زیر که واسه کلاس =+ هست از پویتر استفاده بشه:


thing& thing::operator+=(thing& t)
{
something += t.something;
return *this;
}

آخه جفت اینا اگه پوینتر نباشه یعنی هم thing& و هم پروتوتایپ (thing& t) مشکلی پیش نمیاد.

سلام.
اگر مقدار بازگشتی و Format Parameter تابع رو Reference تعریف نکنید و فرض کنیم کلاس thing حجیم باشه، اونوقت نسخه جدیدی از thing در حافظه ایجاد میشه (یه Copy از نسخه فعلی) و به این ترتیب Resource های سیستمی بی جهت هدر میره. بهمین دلیل هستش که اونها رو Reference تعریف می کنن، تا روی Object های موجود در حافظه کار کنه و مقادیر سمت چپ اون operator رو به روز کنه. در ضمن، بهتره هنگام تعریف Formal Parameter تابع، اونو const نیز تعریف کنید:

thing& thing::operator+=(const thing& t) {
return *this;
}


البته، اگر مقدار بازگشتی رو Reference تعریف نکنید، اونوقت بسته به نحوه استفاده، ممکنه نتایج نادرستی نیز بگیرید. به عنوان نمونه این سوال و جواب (http://cboard.cprogramming.com/cplusplus-programming/115837-importance-returning-reference-operator-overloading.html) رو دقیق تا انتها بخونید.

موفق باشید.

H_G_G_I
یک شنبه 10 دی 1391, 20:30 عصر
شما اینو در نظر بگیر !

int a = 0;
(a += 2) += 4;

شما الان تو این کد توقع داری a بشه 6 دیگه !
وقتی با 2 جمعش میکنی بعد دوباره با 4 جمع می کنی ! در اخر مقدار a باید بشه 6 !
ولی وقتی رفرنس برنگردونی جمع دوم روی متغیر دیگه که برگشت داده شده انجام میشه و در نتیجه a همون 2 می مونه !