Đầu tiên, một số quy tắc của ngón tay cái:
Sử dụng std::unique_ptrnhư một con trỏ thông minh không có phí. Bạn không cần phải bận tâm với con trỏ thô thường xuyên. std::shared_ptrtương tự như vậy là không cần thiết trong hầu hết các trường hợp. Mong muốn sở hữu chung thường phản bội sự thiếu suy nghĩ về quyền sở hữu ngay từ đầu.
Sử dụng std::arraycho các mảng có độ dài tĩnh và std::vectorcho động.
Sử dụng rộng rãi các thuật toán chung, đặc biệt:
<algorithm>
<numeric>
<iterator>
<functional>
Sử dụng autovà decltype()bất cứ nơi nào họ có lợi cho khả năng đọc. Cụ thể, khi bạn muốn khai báo một thứ, nhưng thuộc loại mà bạn không quan tâm, chẳng hạn như kiểu lặp hoặc kiểu mẫu phức tạp, hãy sử dụng auto. Khi bạn muốn khai báo một điều theo kiểu của một điều khác, hãy sử dụng decltype().
Làm cho mọi thứ an toàn khi bạn có thể. Khi bạn có các xác nhận thực thi bất biến đối với một loại điều cụ thể, logic đó có thể được tập trung trong một loại. Và điều này không nhất thiết phải làm cho bất kỳ chi phí thời gian chạy. Cũng không nên nói rằng (T)xnên tránh các phôi kiểu C ( ) để ủng hộ các phôi kiểu C ++ rõ ràng hơn (và có thể tìm kiếm!) (Ví dụ static_cast:).
Cuối cùng, biết quy tắc của ba:
- Phá hủy
- Sao chép hàm tạo
- Toán tử chuyển nhượng
Đã trở thành quy tắc của năm với việc bổ sung hàm tạo di chuyển và toán tử gán di chuyển. Và hiểu các tài liệu tham khảo rvalue nói chung và làm thế nào để tránh sao chép.
C ++ là một ngôn ngữ phức tạp, vì vậy thật khó để mô tả cách tốt nhất để sử dụng tất cả ngôn ngữ đó. Nhưng thực tiễn phát triển C ++ tốt không thay đổi căn bản với C ++ 11. Bạn vẫn nên ưu tiên các bộ chứa được quản lý bộ nhớ hơn quản lý bộ nhớ thủ công Con trỏ thông minh giúp dễ dàng thực hiện việc này một cách hiệu quả.
Tôi có thể nói rằng C ++ hiện đại thực sự hầu như không có quản lý bộ nhớ thủ công. Ưu điểm của mô hình bộ nhớ của C ++ là nó mang tính quyết định , không phải là thủ công. Các thỏa thuận có thể dự đoán sẽ làm cho hiệu suất dễ dự đoán hơn.
Đối với một trình biên dịch, G ++ và Clang đều cạnh tranh về các tính năng của C ++ 11 và nhanh chóng bắt kịp những thiếu sót của chúng. Tôi không sử dụng Visual Studio, vì vậy tôi không thể nói hay chống lại nó.
Cuối cùng, một lưu ý về std::for_each: tránh nó nói chung.
transform, accumulateVà erase- remove_iflà tốt cũ chức năng map, foldvà filter. Nhưng for_eachnói chung chung hơn, và do đó, ít ý nghĩa hơn, nó không thể hiện bất kỳ ý định nào ngoài việc lặp lại. Bên cạnh đó, nó được sử dụng trong các tình huống tương tự như dựa trên phạm vi forvà nặng hơn về mặt cú pháp, ngay cả khi được sử dụng không có điểm. Xem xét:
for (const auto i : container)
std::cout << i << '\n';
std::for_each(container.begin(), container.end(), [](int i) {
std::cout << i << '\n';
});
for (const auto i : container)
frobnicate(i);
std::for_each(container.begin(), container.end(), frobnicate);