如果您需要自己显式声明析构函数,复制构造函数或复制赋值运算符,则可能需要显式声明这三个函数。
但是,另一方面,马丁的“ 清理代码 ”建议删除所有空的构造函数和析构函数(第293页,G12:Clutter):
没有实现的默认构造函数有什么用?它要做的只是用毫无意义的工件使代码混乱。
那么,如何处理这两种相反的意见呢?是否应该真正实现空的构造函数/析构函数?
下一个示例准确地说明了我的意思:
#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
的析构函数为struct A
空,并非真正需要。那么,它应该在那里还是应该删除?
virtual ~base () = default;
不编译(有一个很好的理由)
auto_ptr
其中任何一个。