PDA

View Full Version : سوال: تحلیل این کد که از اشاره گر this استفاده کرده؟



complexcoding
جمعه 18 فروردین 1391, 15:47 عصر
دوستان سلام
می شه این کد رو خط به خط توضیح بدین. و بگید چه کاری انجام می ده.
توضیحات برای روشن شدن بیشتر کد : بارگذای عملگر ++ برای کلاس test و ( a و b ) از اعضای داده ای خصوصی کلاس تست می باشند. سوالم درباره خط اول و دوم و چرا در آخر return *this رو ننوشته؟؟

test test :: operator++(){
test temp = *this;
a++;
b++;
return temp;
}


خیلی ممنون از کمک شما دوستان

MAN_UNITED
جمعه 18 فروردین 1391, 17:23 عصر
سلام دوست عزیز
توضیح خط اول :
test اول منظور خروجی تابع هست یعنی یک شی از کلاس تست و بر میگردونه
::test یعنی شما دارید اپراتور ++ رو برای کلاس test پیاده سازی میکنید
توضیح خط دوم:
یک شی temp از کلاس test گرفته و شی ضمنی رو داخلش ریخته
this* فقط برای شی ضمنی به کار میره
مثلا:
;test ob1,ob2
ob1.insert(ob2)
ob1 به صورت ضمنی وارد متد insert شده و ob2 به صورت صریح

و اینکه چرا this* رو return نکرده دلیلش اینه که این متد ++ پسوندی هستش یعنی اول عملیات انجام میشه بعد به هر کدوم از صفات یک عدد اضافه میشه پس یک بک آپ گرفته از شی ضمنی و به صفات یکی اضافه کرده و بک آپ و return کرده
پس وقتی عملیات روی temp که return شده انجام شد شی ضمنی به صفاتش یک واحد اضافه شده است.

complexcoding
جمعه 18 فروردین 1391, 23:00 عصر
ببخشید یک سوال ؟ خوب یعنی به شی temp هیچی اضافه نشده و به اشیای شی ضمنی this* یکی اضافه شده و پس وقتی از ++ به صورت پسوندی استفاده می کنیم وقتی که return temp به کار بردیم چطوری در اعضای این شی به صورت پسوندی تغییر ایجاد می شه ما که از this* استفاده نکردیم؟؟؟؟؟؟؟

MAN_UNITED
جمعه 18 فروردین 1391, 23:46 عصر
بله صفات temp هیچ تغییری نکرده اند دلیل شو تو مثال زیر میگم
مثلا من میخوام یک شی رو با شی دوم جمع کنم و بریزم تو شی سوم و هر دفعه شی دوم جمع بشه و یکی به صفات شی دوم اضافه بشه

test ob1,ob2,sum;
for(int i=0;i<10;i++)
sum=ob1+ob2++;

خوب اینجا وقتی i=0 باید اول ob1 و ob2 با هم جمع بشن بعد به صفات ob2 یکی اضافه بشه پس ob2 وارد متد ++ میشه و یک بک آپ ازش گرفته میشه و به صفاتش یکی اضافه میشه و وقتی از متد خارج میشه به جای ob2 در دستور فوق temp میشنیه که هیچ تغییری نکرده ولی صفات ob2 چون در متد ++ شده اند تغییر کرده اند
پس در حقیقت وقتی ob2 وارد متد میشه و خارج میشه با یک واحد به صفات اضافه شده خارج میشه ولی temp تغییری نکرده در اصل این
sum=ob1+temp;
میشه
و حالا چرا صفات this* تغییر کرده اند چون که به صورت ضمنی وارد شده و مانند ارسال متغییر به صورت ارجائی(ورودی و خروجی) که اگه تغییر کنند در متغییر اصلی تاثیر میذاره