Cho e hỏi Destructor có nhất thiết sử dụng cùng với Constructor không ạ? Và mình nên sử dụng nó khi nào ạ?
Khi nào nên sử dụng Destructor
Không nhất thiết. Khi bạn tạo đối tượng với nhiều biến mà allocate bộ nhớ, bạn đưa phần code giải phóng dữ liệu vào trong destructor. Destructor sẽ được gọi khi bạn delete đối tượng, nó thực thi phần code bạn vừa viết để giải phóng bộ nhớ.
cho e hỏi thêm có destructor mặc định ko ạ? 
Mặc định là k có code gì bên trong, chỉ đơn giản ~ClassName(){};
Bạn hiểu ngược rồi, bạn không nên hiểu là khi nào cần dùng destructor, bạn nên hiểu theo hướng là khi nào cần phải giải phóng dữ liệu (bao gồm những tài nguyên dính líu đến nó).
Nếu bạn có cái object thì khi nó được thu hồi bộ nhớ, những cái tài nguyên dính líu đến nó mà chỉ thông qua con đường pointer/handle thì sẽ không được thu hồi tự động (vì máy tính nó ngu chỉ biết làm theo lệnh con người, những tài nguyên đó không nằm trong object được thu hồi), đây là lúc bạn cần cung cấp cho class của object đó 1 method destructor để đương lúc thu hồi bộ nhớ thì hệ thống C++ runtime sẽ chạy method destructor đó, trong method đó bạn có thể viết code thu hồi bộ nhớ cho các dữ liệu khác có dính líu.
Rule of 3: Copy constructor, assignment operator, destructor. Khi đã cần 1 trong 3 thì phải cài cả ba phương thức.
Rule of 5: rule of 3 + move semantic
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?