กฎ 3 ( กฎ 5ในมาตรฐาน c ++ ใหม่):
หากคุณต้องการประกาศตัว Destructor ให้คัดลอก Constructor หรือตัวดำเนินการกำหนดค่าด้วยตนเองอย่างชัดเจนคุณอาจต้องประกาศทั้งสามอย่างชัดเจน
แต่ในทางกลับกัน " รหัสสะอาด " ของ Martin แนะนำให้ลบตัวสร้างและตัวทำลายที่ว่างเปล่าทั้งหมด (หน้า 293, G12: ความยุ่งเหยิง ):
สิ่งที่ใช้เป็นตัวสร้างเริ่มต้นโดยไม่มีการใช้งาน? สิ่งที่มันทำคือถ่วงโค้ดด้วยส่วนที่ไม่มีความหมาย
ดังนั้นวิธีจัดการกับทั้งสองความคิดเห็นที่ตรงกันข้าม? ควรใช้ตัวสร้าง / ตัวทำลายที่ว่างเปล่าจริงหรือไม่?
ตัวอย่างถัดไปแสดงให้เห็นถึงสิ่งที่ฉันหมายถึง:
#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;
}
รวบรวมการปรับโดยใช้ g ++ 4.6.1 ด้วย:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
destructor สำหรับstruct A
ว่างเปล่าและไม่จำเป็นจริงๆ ดังนั้นควรอยู่ที่นั่นหรือควรลบออก
virtual ~base () = default;
ไม่คอมไพล์ (ด้วยเหตุผลที่ดี)
auto_ptr
อย่างใดอย่างหนึ่ง