ฉันเป็นแฟนตัวยงของการให้คอมไพเลอร์ทำงานให้คุณได้มากที่สุด เมื่อเขียนคลาสง่าย ๆ คอมไพเลอร์สามารถให้สิ่งต่อไปนี้กับ 'ฟรี':
- ตัวสร้างเริ่มต้น (ว่าง)
- ตัวสร้างสำเนา
- ผู้ทำลายล้าง
- ผู้ประกอบการที่ได้รับมอบหมาย (
operator=
)
แต่ก็ดูเหมือนจะไม่สามารถทำให้คุณดำเนินการเปรียบเทียบใด ๆ - เช่นหรือoperator==
operator!=
ตัวอย่างเช่น:
class foo
{
public:
std::string str_;
int n_;
};
foo f1; // Works
foo f2(f1); // Works
foo f3;
f3 = f2; // Works
if (f3 == f2) // Fails
{ }
if (f3 != f2) // Fails
{ }
มีเหตุผลที่ดีสำหรับสิ่งนี้หรือไม่? เหตุใดการเปรียบเทียบแบบเปรียบเทียบระหว่างสมาชิกจึงเป็นปัญหา เห็นได้ชัดว่าถ้าชั้นจัดสรรหน่วยความจำแล้วคุณจะต้องระวัง แต่สำหรับชั้นเรียนที่เรียบง่ายแน่นอนผู้แปลสามารถทำสิ่งนี้ให้คุณ?
==
ในลักษณะเดียวกับที่มีการมอบหมายอัตโนมัติเริ่มต้น ( =
) ภายใต้เงื่อนไขบางประการ (อาร์กิวเมนต์เกี่ยวกับตัวชี้ไม่สอดคล้องเพราะตรรกะใช้ได้ทั้งสำหรับ=
และ==
และไม่เพียง แต่เป็นครั้งที่สอง)