मैं कंपाइलर को आपके लिए ज्यादा से ज्यादा काम करने देने का बहुत बड़ा प्रशंसक हूं। एक साधारण वर्ग लिखते समय कंपाइलर आपको 'मुफ्त' में दे सकता है:
- एक डिफ़ॉल्ट (खाली) कंस्ट्रक्टर
- एक कॉपी कंस्ट्रक्टर
- एक विध्वंसक
- एक असाइनमेंट ऑपरेटर (
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
{ }
क्या इसका कोई अच्छा कारण है? सदस्य-दर-सदस्य तुलना करना एक समस्या क्यों होगी? जाहिर है अगर वर्ग स्मृति आवंटित करता है तो आप सावधान रहना चाहते हैं, लेकिन एक साधारण वर्ग के लिए निश्चित रूप से कंपाइलर आपके लिए ऐसा कर सकता है?
==
, उसी तरह से =
कुछ शर्तों के तहत एक डिफ़ॉल्ट स्वचालित असाइनमेंट ( ) है। (संकेत के बारे में तर्क असंगत क्योंकि तर्क के लिए दोनों पर लागू होता है है =
और ==
, और न सिर्फ दूसरे के लिए)।