Quy tắc 3 ( quy tắc 5 trong tiêu chuẩn c ++ mới) nêu rõ:
Nếu bạn cần phải khai báo rõ ràng hàm hủy, sao chép hàm tạo hoặc toán tử gán gán sao chép, có lẽ bạn cần khai báo rõ ràng cả ba hàm này.
Tuy nhiên, mặt khác, " Mã sạch " của Martin khuyên nên xóa tất cả các hàm tạo và hàm hủy trống (trang 293, G12: Clutter ):
Việc sử dụng là một constructor mặc định không có triển khai? Tất cả những gì nó làm là làm lộn xộn mã với các tạo tác vô nghĩa.
Vậy, làm thế nào để xử lý hai ý kiến trái chiều này? Các nhà xây dựng / phá hủy trống thực sự nên được thực hiện?
Ví dụ tiếp theo thể hiện chính xác những gì tôi muốn nói:
#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;
}
Biên dịch tốt bằng g ++ 4.6.1 với:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
Các hàm hủy cho struct A
trống, và không thực sự cần thiết. Vì vậy, nó nên ở đó, hoặc nó nên được gỡ bỏ?
virtual ~base () = default;
không biên dịch (với một lý do chính đáng)
auto_ptr
.