PDA

View Full Version : سوال: مشکل در فهم قسمتی از کد



motherboard
سه شنبه 04 شهریور 1393, 02:15 صبح
سلام.بحث overload ها چه تفاوتی رو با خط 53 کد داره؟


#include <iostream>

using namespace std;

class Line
{
public:
int getLength( void );
Line( int len ); // simple constructor
Line( const Line &obj); // copy constructor
~Line(); // destructor

private:
int *ptr;
};

// Member functions definitions including constructor
Line::Line(int len)
{
cout << "Normal constructor allocating ptr" << endl;
// allocate memory for the pointer;
ptr = new int;
*ptr = len;
}

Line::Line(const Line &obj)
{
cout << "Copy constructor allocating ptr." << endl;
ptr = new int;
*ptr = *obj.ptr; // copy the value
}

Line::~Line(void)
{
cout << "Freeing memory!" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}

void display(Line obj)
{
cout << "Length of line : " << obj.getLength() <<endl;
}

// Main function for the program
int main( )
{
Line line1(10);

Line line2 = line1; // This also calls copy constructor

display(line1);
display(line2);

return 0;
}

parvizwpf
سه شنبه 04 شهریور 1393, 09:39 صبح
منظور اگه display هست. هنوز در واقع overload ی روی اون شکل نگرفته.
بعد من اومدم تست کنم خطا زیاد داشت.

motherboard
سه شنبه 04 شهریور 1393, 11:15 صبح
کد کاملا سالم هست.تو چی امتحان کردی؟
ضمن اینکه مگر overload ها برای این نیست که عملگرها رو برای اشیاء قابل فهم کنه.الان تو خط 53 هم توسط عملگر (=) line1 به line 2 ریخته شده.مگه این overload نیست؟ و اگر هست چرا از عبارت operator برای یک تابعی استفاده نشده؟

omid_kma
سه شنبه 04 شهریور 1393, 11:26 صبح
اون operator نیست copy constructor رو صدا میزنه
سوالتو واضح تر بپرس من نفهمیدم روی چی اشکال داری

motherboard
سه شنبه 04 شهریور 1393, 11:51 صبح
مگه operator کارش این نیست که عملگر ها رو گرانبار کنه تا بتونیم مثلا با (=) محتویات یک شی رو به شی دیگر بریزیم؟

omid_kma
سه شنبه 04 شهریور 1393, 12:30 عصر
ما انواع متفاوتی از سازنده ها داریم سازنده های معمولی که مثلا عدد یا چیزای دیگه میگیرن , سازنده کپی یا (copy constructor ) که ورودیش یک شی از نوع خودش هست برای این استفاده میشه که زمان ساختن شی کپی انجام بشه . سازنده های دیگه ای هم وجود داره مثلا move constructor
سازنده هم میدونید که تفاوتی با بقیه توابع یا عملگر ها داره اینه که مقدار بازگشتی نداره و اکثر اوقات هم برای مقدار دادن به اعضای کلاس ازش استفاده میشه
حالا تو این کد

Line line2 = line1;



این جا چون دقیقا موقع تعریف a از = استفاده کردیم با این معادل هست :


Line2 line2(line1);

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

Line1 a;
a=line2;

حالا ممکنه سوال برات پیش بیاد چرا زمان ساختن هم اپراتور مساوی رو صدا نمیزنه ؟!
دلیل برمیگرده به performance !! به این شکلی که الان هست یک سازنده کمتر صدا میزنه چون اگر قرار بود = صدا زده بشه قبلش باید سازنده بدون ورودی هم صدا زده بشه .
این مثال فکر کنم واضح تر باشه :

#include <iostream>


class A
{
public:
A(){ std::cout << "In constructor\n"; }
A(const A& other){ std::cout << "In copy constructor\n"; }
void operator=(const A& other){ std::cout << "In operator =\n"; }


};


int main()
{
A a;
A b = a;//in copy constructor chap mishe
b = a;//In operator chap mishe
return 0;
}

مسعود اقدسی فام
سه شنبه 04 شهریور 1393, 12:46 عصر
مگه operator کارش این نیست که عملگر ها رو گرانبار کنه تا بتونیم مثلا با (=) محتویات یک شی رو به شی دیگر بریزیم؟

گرانبار رو جای overload پیشنهاد دادن؟ یا خود مترجم اینطوری ترجمه کرده؟ بار اولمه می‌شنوم. سربارگذاری بود.

در مورد سوالتون:

بله حرف شما درسته. اما خط 53 ربطی به این موضوع نداره. اونجا متغیر تعریف و در جا مقداردهی می‌شه که توابع سازنده رو فراخوانی می‌کنه. در کل عملگر = به صورت پیشفرض تعریف شده و فقط زمانی تعریفش رو دست‌کاری می‌کنن که عملیات خاصی مد نظر هست.

parvizwpf
سه شنبه 04 شهریور 1393, 17:52 عصر
یه مبحث داریم بنام overload: که در واقع تعریف چند گانه از یک متد با سازنده میتونه باشه که با یک نام اما با پارامترهای مختلف نوشته میشه.
اما operator در واقع تعریفی درست ازش داشتید.