Sau khi đọc về các nhà xây dựng sao chép và sao chép các toán tử gán trong C++, tôi đã cố tạo một ví dụ đơn giản. Mặc dù đoạn mã bên dưới dường như hoạt động, tôi không chắc liệu tôi có đang triển khai bản sao chép và sao chép toán tử gán đúng cách hay không. Bạn có thể vui lòng chỉ ra nếu có bất kỳ sai sót/cải tiến hoặc một ví dụ tốt hơn để hiểu các khái niệm có liên quan.C++: Triển khai thực hiện sao chép bản sao và sao chép phép gán
class Foobase
{
int bInt;
public:
Foobase() {}
Foobase(int b) { bInt = b;}
int GetValue() { return bInt;}
int SetValue(const int& val) { bInt = val; }
};
class Foobar
{
int var;
Foobase *base;
public:
Foobar(){}
Foobar(int v)
{
var = v;
base = new Foobase(v * -1);
}
//Copy constructor
Foobar(const Foobar& foo)
{
var = foo.var;
base = new Foobase(foo.GetBaseValue());
}
//Copy assignemnt operator
Foobar& operator= (const Foobar& other)
{
if (this != &other) // prevent self-assignment
{
var = other.var;
base = new Foobase(other.GetBaseValue());
}
return *this;
}
~Foobar()
{
delete base;
}
void SetValue(int val)
{
var = val;
}
void SetBaseValue(const int& val)
{
base->SetValue(val);
}
int GetBaseValue() const
{
return(base->GetValue());
}
void Print()
{
cout<<"Foobar Value: "<<var<<endl;
cout<<"Foobase Value: "<<base->GetValue()<<endl;
}
};
int main()
{
Foobar f(10);
Foobar g(f); //calls copy constructor
Foobar h = f; //calls copy constructor
Foobar i;
i = f;
f.SetBaseValue(12);
f.SetValue(2);
Foobar j = f = z; //copy constructor for j but assignment operator for f
z.SetBaseValue(777);
z.SetValue(77);
return 1;
}
+1 điểm tốt sao chép và hoán đổi thành ngữ là điều cần thiết để có một thực thi ngoại lệ an toàn đảm bảo đối tượng vẫn ở trạng thái nhất quán. – jdehaan
Sẽ không bộ nhớ được giải phóng bởi destructor '~ Foobar()'? – blitzkriegz
@Mahatma: '~ Foobar()' sẽ không được gọi; đối tượng không bao giờ bị hủy, nó được gán cho. –