سربار گزاری copy constructor و اپراتور = - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

سربار گزاری copy constructor و اپراتور =

+1 امتیاز
چه وقتایی باید این 2 تا رو overload کنیم ؟اصلا کار این 2 تا چیه و چه موقع اجرا میشن ؟
سوال شده آذر 6, 1392  بوسیله ی afshin70 (امتیاز 44)   4 7 12

2 پاسخ

+1 امتیاز

زمانی که میخواهبد از Deep Copy بجای Shallow Copy بکارگیری کنید باید سربارگزاری کنید .

در حالت معمولی خود = یجور Shallow Copy رو انجام میده .

زمانی که شما ۲ تا نمونه از هر کلاس (برای نمونه کلاس std::string ) داری و میخوای با استفاده از = محتویات یکی رو تو یکی دیگه بیریزی اینها صدا زده میشن .

 

درباره ی Shallow Copy و Deep Copy هم یه سر به اینجا بزن :‌

http://www.7khatcode.com/335/%DA%86%D9%87-%D9%88%D9%82%D8%AA-%D8%A7%D8%B2-deep-copy-%D9%88-shallow-copy-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85%D8%9F

پاسخ داده شده دی 5, 1392 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
+1 امتیاز

یکی دیگه از جا هایی که  باید حتما  این 2 تا رو overload کنی  وقت هایی هست که داخل constructor از new استفاده کردی

مثلا این کد  به مشکل می خوره چون موقع صدا زدن = فقط آدرس وکتور کپی میشه داخل وکتور اون یکی کلاس پس وقتی که شی c1 پاک بشه یا محتویات وکتور داخلش عوض بشه شی c2 هم مقادریر وکتور داخلش عوض میشه و یا پاک میشه

#include <iostream>
#include <vector>
using namespace std;

class MyClass
{
public:

    MyClass()
    {
        variables=new vector<int>({1,2,3});
    }
    ~MyClass()
    {
        delete variables;
    }
    vector<int> *variables;
};

int main()
{
    MyClass *c1=new MyClass();
    MyClass c2=*c1;
    
    delete c1;
    
    cout<< (*(c2.variables))[2];/////ERROR

    return 0;
}

 

 

کد درست تر :

#include <iostream>
#include <vector>
using namespace std;

class MyClass
{
public:

    MyClass()
    {
        variables=new vector<int>({1,2,3});
    }
    MyClass& operator = (const MyClass& other)
    {
        variables->clear();
        variables->insert(variables->end(),other.variables->begin(),other.variables->end());
        return *this;
    }
    MyClass(const MyClass& other)
    {
       variables=new vector<int>();
       variables->insert(variables->begin(),other.variables->begin(),other.variables->end());
    }
    ~MyClass()
    {
        delete variables;
    }
    vector<int> *variables;
};

int main()
{
    MyClass *c1=new MyClass();
    MyClass c2=*c1;//copy constructor

    delete c1;

    cout<<(*c2.variables)[2];

    return 0;
}

 

پاسخ داده شده دی 5, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...