PDA

View Full Version : سربار گزاری عملگر در این مثال چگونه هست؟



hosseinam1370
چهارشنبه 02 مهر 1393, 09:49 صبح
دوستان در این مثال :
#include "stdafx.h"
#include <iostream>
using namespace std;
class sample
{
private:
int a;
public:
sample (int input)
{
a = input;
}
int operator + ( sample obj)
{
a = a + obj.a;
return a;
}
};
int main()
{
sample ob1(5) , ob2(6);
int b = ob1 + ob2 ;
cout << b << endl;
system ("pause");
}

الان اینجا یعنی چی؟
int operator + ( sample obj)
{
a = a + obj.a;
return a;
}


و تو این خط داخل main چه اتفاقی میاوفته؟
int b = ob1 + ob2 ;

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


با تشکر.

parvizwpf
چهارشنبه 02 مهر 1393, 09:54 صبح
در واقع میگه که هر موقع خواستم دو آبجکت رو از نوع کلاس sample جمع ببندم ، عملیات جمع رو به سبکی که من داخل سربارگذاری عملگر بیان کردم انجام بده. و در واقع داره مقدار دو متغیر a در دو کلاس رو جمع میزنه.

hosseinam1370
چهارشنبه 02 مهر 1393, 13:20 عصر
سلام.
پس چرا تو این خط :
int operator + ( sample obj)
{
a = a + obj.a;
return a;
}

obj از نوع sample شد؟
در ضمن با f10 تریس میکنم ، این تابع فقط یبار فراخانی میشه ، چجوری هم 5 و داره و هم 6 رو ؟
یخورده به زبان ساده تر بگید واقعا ممنون میشم.

با تشکر.

parvizwpf
چهارشنبه 02 مهر 1393, 16:52 عصر
مبتونید برای درک بهتر، مباحث سربارگذاری عملکرها رو مطالعه کنید.

rahnema1
چهارشنبه 02 مهر 1393, 19:19 عصر
سلام.
پس چرا تو این خط :
obj از نوع sample شد؟


منظورتون اینه که با f10 مشخص شد که از نوع sample هست؟

hosseinam1370
پنج شنبه 03 مهر 1393, 15:40 عصر
مبتونید برای درک بهتر، مباحث سربارگذاری عملکرها رو مطالعه کنید.
دارم میخونم و دنبال مطلب میگرم، اگه لینک داری ممنون میشم بذارید اینجا.



منظورتون اینه که با f10 مشخص شد که از نوع sample هست؟

نه .
یعنی اینکه من برنامه ی بالا رو تریس میکنم، وقتی که رسید به خط
int b = ob1 + ob2 ; l
و وقتی که روی همین خط f11 میکنم ، فقط یبار میره داخل تابع operator و برمیگرده ، و حاصل رو محاسبه میکنه.
الان این برام گنگ هست که ، چجوری وقتی + رو میبینه ، مقدار های ob1 va ob2 رو میده به تابع و تابع جمع میکنه و خروجی میده!!؟/
امیدوارم تونستم منظورمو انتقال بدم.
اگه یه راهنمایی کوچیک کنید ممنون میشم.

با تشکر.

parvizwpf
پنج شنبه 03 مهر 1393, 15:49 عصر
الا ماشااله که منبع برای فهمیدنش وجود داره کافیه جستجو کنید.
ببینید زیاد غرق شدن در اینکه چرا و چطور میپره داخل کد اپراتور رو باید فقط بپذیرید . شما نمیتونید این رو با نوستن بک فانکشن که خودتون مثلا مینویسید مقایسه، انتطار چنان رخدادی و تریس گام ب گام ازش داشته باشید. اینو فقط بپذیرید که هنگامی که میخواهید به سبک خودتون عملگر ها رو پباده کنید اینطوری کد نویسی کنید. اونها رو برابر رفتار فانکشنها قرار ندید چون سینتکس جور دیگه ای هست. بعد مگه شما انتظار دارید چند بار بره داخب اون کد مگه؟ باید 1 بار فراخوانی کنه دیگه نه اینکه به ازای مثلا هر آبجکت رجوع کنه. این سینتکس برای c مشخصه و بهنگام دیدن کد عملگر همه چی رو انجام میده. سپاسگذارم.

مسعود اقدسی فام
پنج شنبه 03 مهر 1393, 17:11 عصر
نه .
یعنی اینکه من برنامه ی بالا رو تریس میکنم، وقتی که رسید به خط
int b = ob1 + ob2 ; l
و وقتی که روی همین خط f11 میکنم ، فقط یبار میره داخل تابع operator و برمیگرده ، و حاصل رو محاسبه میکنه.
الان این برام گنگ هست که ، چجوری وقتی + رو میبینه ، مقدار های ob1 va ob2 رو میده به تابع و تابع جمع میکنه و خروجی میده!!؟/
امیدوارم تونستم منظورمو انتقال بدم.
اگه یه راهنمایی کوچیک کنید ممنون میشم.

با تشکر.

خط
int b = ob1 + ob2 ;

رو اینطوری ببینید:


int b = ob1.operator+(ob2);

یعنی تابع + شی ob1 فراخوانی می‌شه و ob2 براش به عنوان پارامتر ارسال می‌شه.
حالا اگه یه همچین خطی داشته باشید:


int b = ob1 + 5 ;


تبدیل می‌شه به:
int b = ob1.operator+(5);


پس اصولا باید تابعی داشته باشید به این فرم:
int operator + (int obj)

تا شی ob1 سمت چپ رو با عدد صحیح 5 (که توی تابع متغیر صحیح obj هستش) جمع بزنید. همچین تابعی داخل کد نوشته نشده. پس نمی‌شه اونطور خطی داشت و خطا می‌ده.
یا ممکنه؛


sample b = ob1 + ob2 ;
داشته باشید که اتفاقا خیلی هم مرسوم هست و کاربرد داره. اینجا باید تابع داخل کلاس اینطوری باشه:

sample operator + (sample obj)

که وجود نداره.

یه مثال ساده می‌زنم. یه عدد مختلط وقتی با یه عدد مختلط جمع بشه خروجی حتما مختلط می‌شه. درسته که ممکنه قسمت موهومی نداشته باشه، اما خب کل اعداد حقیقی هم مختلط با قسمت موهومی صفر هستن. در ضمن می‌شه یه عدد مختلط رو با یه عدد حقیقی یا صحیح جمع زد، که بازم نتیجه مختلط هستش. پس اگه اسم کلاس مختلطم رو complex بذارم، این عملها رو باید بشه انجام داد:



complex a, b, c;
double d;
int e;
/* مقدار دهی */
c = a + b;
c = a + d;
c = a + e;
c = d + a;
c = e + a;


هر کدوم از این پنج خط عمل جمع یه تابع جدا دارن. چون طرف راست یا چپشون متفاوت (از نظر نوع داده) با بقیه هست.

rahnema1
پنج شنبه 03 مهر 1393, 17:13 عصر
یعنی اینکه من برنامه ی بالا رو تریس میکنم، وقتی که رسید به خط
int b = ob1 + ob2 ; l
و وقتی که روی همین خط f11 میکنم ، فقط یبار میره داخل تابع operator و برمیگرده ، و حاصل رو محاسبه میکنه.
الان این برام گنگ هست که ، چجوری وقتی + رو میبینه ، مقدار های ob1 va ob2 رو میده به تابع و تابع جمع میکنه و خروجی میده!!؟/
امیدوارم تونستم منظورمو انتقال بدم.
اگه یه راهنمایی کوچیک کنید ممنون میشم.

با تشکر.

خود عملگر + هم یک نوع تابع حساب میشه که دو تا پارامتر از نوع sample می گیره و خروجی از نوع int میده بیرون