Bối cảnh: Tôi có một lớp phức tạp với nhiều biến. Tôi có công cụ tạo bản sao âm thanh và thử nghiệm:Tôi có thể sử dụng vị trí mới (điều này) trong toán tử =?
Applepie::Applepie(const Applepie ©) :
m_crust(copy.m_crust),
m_filling(copy.m_filling)
{
}
Một số nhà xây dựng bản sao biến thành viên được gọi trong danh sách intializer thực hiện phân bổ.
Câu hỏi: Tôi cần tạo operator=
. Thay vì nhân đôi constuctor hiện với nhiệm vụ thay vì danh sách khởi tạo, và giải phóng bộ nhớ đang được thay thế, và vv vv vv, tôi có thể chỉ đơn giản là làm như sau:
Applepie& Applepie::operator=(const Applepie ©)
{
if(this != ©)
{
this->~Applepie(); // release own object
new(this) Applepie(copy); // placement new copy constructor
}
return *this;
}
Nói cách khác, là phá hủy tự tiếp theo là một vị trí new constructor sao chép ngữ nghĩa giống hệt với toán tử =?
Điều này dường như có khả năng làm giảm đáng kể mã lặp lại và xác nhận rằng mỗi biến được khởi tạo đúng cách, với chi phí tiềm năng giảm nhẹ hiệu quả trong quá trình gán. Tôi có thiếu cái gì đó mơ hồ hơn không?
Lý do: Lớp thực tế của tôi có khoảng 30 biến. Tôi lo lắng về thực tế là cả hai nhà xây dựng bản sao của tôi và nhà điều hành chuyển nhượng của tôi phải sao chép tất cả ba mươi, và rằng mã có thể phân kỳ, làm cho hai hoạt động để làm những việc khác nhau.
Nếu ctor sao chép ném, bạn đã phá vỡ đối tượng, do đó, bạn không đưa ra bất kỳ đảm bảo an toàn kỳ vọng nào. –
@R Martinho - Dường như với tôi rằng bất kỳ tình huống nào trong đó bản sao ctor sẽ ném cũng sẽ khiến toán tử của tôi = ném nếu tôi được gán thủ công mỗi biến ... Vậy ... điều đó vẫn có vẻ tương đương? – jcwenger
vấn đề không phải là 'toán tử =' ném, là 'toán tử =' rời khỏi đối tượng trong trạng thái không hợp lệ! Nó đã bị phá hủy. –