İlk olarak, bazı kurallar:
std::unique_ptr
Genel gider akıllı işaretçisi olarak kullanın . Ham işaretçilerle bu kadar sık uğraşmanıza gerek yok. std::shared_ptr
Aynı şekilde çoğu durumda gereksizdir. Paylaşılan mülkiyet isteği, genellikle ilk başta mülkiyet konusunda düşünce eksikliğine ihanet eder.
Kullanım std::array
statik uzunlukta diziler için ve std::vector
dinamik için.
Genel olarak genel algoritmalar kullanın, özellikle:
<algorithm>
<numeric>
<iterator>
<functional>
Kullanılabilirliği auto
ve decltype()
nerelerde okunabilirlik kullandığını kullanın . Özellikle, bir şeyi bildirmek istediğinizde, ancak yineleyici veya karmaşık şablon türü gibi umursamadığınız bir tür belirtmek istediğinizde kullanın auto
. Bir şeyi başka bir şeyin türü olarak bildirmek istediğinizde, kullanın decltype()
.
Yapabildiğiniz zaman işleri güvenli hale getirin. Değişmezleri belirli bir konuda zorlayan iddialara sahipseniz, bu mantık bir tipte merkezileştirilebilir. Ve bu mutlaka herhangi bir çalışma zamanı ek yükü sağlamaz. Ayrıca (T)x
daha açık (ve aranabilir!) Lehine C tarzı atmalardan ( ) kaçınılması gerektiğini söylemeden geçmelidir static_cast
.
Son olarak, üçün kuralının nasıl olduğunu bilin:
- çöp yakma fırını
- Yapıcıyı kopyala
- Atama operatörü
Hareket yapıcı ve hareket atama operatörünün eklenmesiyle beş kural olmuştur. Ve genel olarak referans referanslarını ve kopyalamanın nasıl önleneceğini anlayın.
En iyi nasıl kullanılacağını karakterize edilmesi zor bu yüzden C ++, karmaşık bir dildir tüm o. Ancak, iyi C ++ geliştirme uygulamaları C ++ 11 ile temelde değişmedi. Manuel olarak yönetilen bellek yönetimi yerine hala bellek yönetimli kapları tercih etmelisiniz; akıllı işaretçiler bunu verimli bir şekilde yapmayı kolaylaştırır.
Modern C ++ 'nın gerçekten manuel bellek yönetiminden arınmış olduğunu söyleyebilirim; C ++' ın bellek modelinin avantajı , onun manuel olması değil, deterministik olmasıdır. Öngörülebilir ayrılmalar daha öngörülebilir performans sağlar.
Bir derleyiciye gelince, G ++ ve Clang, C ++ 11 özellikleri açısından rekabetçi ve eksikliklerini hızla tespit ediyorlar. Visual Studio kullanmıyorum, bu yüzden ne için ne de buna karşı konuşabiliyorum.
Son olarak, hakkında bir not std::for_each
: genel olarak kaçının.
transform
, accumulate
Ve erase
- remove_if
işlevsel eski iyidir map
, fold
ve filter
. Ancak for_each
daha genel ve bu nedenle daha az anlamlı - döngüden başka bir niyet ifade etmiyor . Bunun yanında, menzil bazlı olduğu gibi aynı durumlarda kullanılır for
ve noktasuz kullanıldığında bile sözdizimsel olarak daha ağırdır. Düşünmek:
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);