3 का नियम ( नए c ++ मानक में 5 का नियम ) कहता है:
यदि आपको स्पष्ट रूप से विध्वंसक, कॉपी कंस्ट्रक्टर या कॉपी असाइनमेंट ऑपरेटर की स्पष्ट रूप से घोषणा करने की आवश्यकता है, तो आपको संभवतः उन तीनों को स्पष्ट रूप से घोषित करने की आवश्यकता है।
लेकिन, दूसरी ओर, मार्टिन के " क्लीन कोड " से सभी खाली कंस्ट्रक्टर और डिस्ट्रक्टर्स (पेज 293, जी 12: अव्यवस्था ) को हटाने की सलाह दी जाती है :
बिना किसी क्रियान्वयन के डिफ़ॉल्ट डिफाल्टर किस उपयोग का है? यह सब करने के लिए अर्थहीन कलाकृतियों के साथ कोड अव्यवस्था है।
तो, इन दो विपरीत विचारों को कैसे संभालना है? क्या खाली कंस्ट्रक्टर / डिस्ट्रक्टर्स को वास्तव में लागू किया जाना चाहिए?
अगला उदाहरण बिल्कुल वही दिखाता है जो मेरा मतलब है:
#include <iostream>
#include <memory>
struct A
{
A( const int value ) : v( new int( value ) ) {}
~A(){}
A( const A & other ) : v( new int( *other.v ) ) {}
A& operator=( const A & other )
{
v.reset( new int( *other.v ) );
return *this;
}
std::auto_ptr< int > v;
};
int main()
{
const A a( 55 );
std::cout<< "a value = " << *a.v << std::endl;
A b(a);
std::cout<< "b value = " << *b.v << std::endl;
const A c(11);
std::cout<< "c value = " << *c.v << std::endl;
b = c;
std::cout<< "b new value = " << *b.v << std::endl;
}
जी + का उपयोग कर संकलन ठीक है। 4.6.1 इसके साथ:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
के लिए विध्वंसक struct A
खाली है, और वास्तव में जरूरत नहीं है। तो, क्या यह वहाँ होना चाहिए, या इसे हटा दिया जाना चाहिए?
virtual ~base () = default;
संकलन नहीं करता है (एक अच्छे कारण के साथ)
auto_ptr
।