چرا بعضی توابع مقدار بازگشتیشون & داره ؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

چرا بعضی توابع مقدار بازگشتیشون & داره ؟

+4 امتیاز

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

    BigNum& operator+=( const BigNum& other )
    {
        const string &num2 = other.data_;
        string &num1 = this->data_;
 
        //add num2 to num1 ...
 
        return *this ;
    }

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

BigNum a("123456789");
BigNum b("2332");
 

خوب تو مین هم که pointer معرفی نشدن که بخواد کلاس refrence برگردونه...دلیلش چیه؟؟
چرا باید خروجی تابع  refrence باشه.اگه نباشه هم جواب درست میداد.حالا چرا باشه؟

سوال شده فروردین 11, 1393  بوسیله ی ali_coder (امتیاز 35)   1 6 9
دوباره تگ گذاری شد مهر 9, 1393 بوسیله ی BlueBlade

1 پاسخ

+2 امتیاز

نوشتن operator بالا بدون & یک مشکل اساسی داره  اونم این که کپی از کلاس برگشت داده میشد که باعث میشه

عبارت هایی به این شکل درست کار نکنن

    a += b += c ;

مثال زیر رو ببینید این جا ما انتظار داریم که مقدار ۱۵ بشه ولی ۶ چاپ میشه

#include <iostream>
#include <string>

using namespace std;
class A
{
public:
    A(int val):
        num(val)
    {}

    A operator +=(const A& other)
    {
        this->num += other.num;
        return *this;
    }
    int num;
};

int main( )
{
    A a(2);
    A b(4);
    A c(9);

    ( a += b ) += c ;

    std::cout<<a.num;

}

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

 

نکته :‌ برای سرعت بیشتر بهتره که از move-semantic  و prefect forwarding هم برای نوشتن  operator ها استفاده کنین

پاسخ داده شده فروردین 11, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...