2013-01-10 22 views
11

Luật pháp dưới đây có tuân theo tiêu chuẩn C++ 11 (= default ngoài định nghĩa của lớp học) không?Mặc định constructor/destructor bên ngoài lớp học?

// In header file 
class Test 
{ 
    public: 
     Test(); 
     ~Test(); 
}; 

// In cpp file 
Test::Test() = default; 
Test::~Test() = default; 
+8

Điều này là tốt, tiêu chuẩn thậm chí sử dụng nó trong một ví dụ ('§8.4.2/3'). '= default' và' = delete' chỉ là các cơ quan chức năng "bình thường" (theo spec, anyways), tức là những gì bạn muốn viết theo định nghĩa *. – Xeo

+2

Lưu ý rằng định nghĩa mặc định có thể xuất hiện sau khi khai báo hàm đầu tiên trong khi định nghĩa đã xóa phải là khai báo đầu tiên của hàm. – MWid

+0

@Xeo Âm thanh như một câu trả lời. –

Trả lời

8

Có, một chức năng thành viên đặc biệt có thể được xác định mặc định nằm ngoài dòng trong tệp .cpp. Nhận ra rằng bằng cách làm như vậy, một số thuộc tính của một hàm nội tuyến mặc định sẽ không áp dụng cho lớp của bạn. Ví dụ: nếu hàm tạo bản sao của bạn được xác định là không nằm trong dòng, lớp của bạn sẽ không được coi là có thể sao chép được một cách trivially (cũng không đủ điều kiện để được nhận dạng là POD). Tương tự như vậy, một destructor out-of-line được định nghĩa mặc định sẽ loại bỏ loại của bạn từ tầm thường (hoặc POD). Điều này có thể hữu ích nếu bạn muốn có một trình tạo bản sao không nội tuyến và kiểm soát nơi nó được định nghĩa (có thể kiểm soát các định nghĩa mẫu được tạo ra nó sẽ yêu cầu), nhưng không muốn xác định nó theo cách thủ công. bản thân bạn với một danh sách khởi tạo thành viên được chế tác thủ công, sẽ mất thời gian và có thể bị lỗi thời.