Vì vậy, trong ví dụ sau, chúng tôi gây ra lớp Foo
để thay thế chính nó bằng *this = Foo()
. Tôi rất vui vì tôi đã thử nghiệm điều này bởi vì nó quay ra trong trường hợp này, các destructor của cũ Foo
không nhận được gọi. Tôi đoán đó là vì toán tử gán mặc định chỉ sử dụng memcpy
... nhưng là câu hỏi thiết kế ngôn ngữ ... tại sao bạn không làm toán tử gán mặc định hủy đối tượng được gán trước để ngăn ngừa tai nạn?Tại sao toán tử gán mặc định không gọi hàm hủy trước?
#include <iostream>
using namespace std;
class MustBeDestroyed //(for some reason not shown here)
{
public:
int i;
MustBeDestroyed(int i) : i(i) {}
~MustBeDestroyed() { cout << "destroyed contained class " << i << endl; }
};
class Foo
{
public:
MustBeDestroyed x;
Foo(int y) : x(y) {}
void replace_myself(int y) { Foo f(y); *this=f; }
void print() { cout << "This is outer/inner class " << x.i << endl; }
~Foo() { cout << "destroyed outer class " << x.i << endl; }
};
int main()
{
Foo a(1);
a.print();
a.replace_myself(2);
a.print();
return 0;
}
Tai nạn gì? Nhiệm vụ chỉ là - gán một giá trị mới cho một giá trị cũ. –
Toán tử gán mặc định không sử dụng memcpy (mặc dù tối ưu hóa trình biên dịch có thể dẫn đến điều đó). Đó là một sự phân công theo từng người. – huskerchad
'int i, j; i = 5; j = i; 'bạn đang nói rằng nó là hợp lý để mong đợi rằng tôi không thể sử dụng' i' nữa? Tôi không đồng ý. – Fiktik