Đầu tiên, một số quy tắc của ngón tay cái:
Sử dụng std::unique_ptr
như 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_ptr
tươ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::array
cho các mảng có độ dài tĩnh và std::vector
cho độ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 auto
và 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)x
nê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
, accumulate
Và erase
- remove_if
là tốt cũ chức năng map
, fold
và filter
. Nhưng for_each
nó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 for
và 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);