ขั้นแรกกฎง่ายๆ:
ใช้std::unique_ptr
เป็นตัวชี้สมาร์ทไม่มีค่าใช้จ่าย คุณไม่จำเป็นต้องกังวลกับพอยน์เตอร์ดิบทั้งหมดที่มักจะเกิดขึ้น std::shared_ptr
ในกรณีส่วนใหญ่ก็ไม่จำเป็นเช่นเดียวกัน ความปรารถนาในการเป็นเจ้าของร่วมแบ่งปันมักจะเป็นการขาดความคิดเกี่ยวกับความเป็นเจ้าของในตอนแรก
ใช้std::array
สำหรับอาร์เรย์ที่มีความยาวคงที่และstd::vector
เป็นแบบไดนามิก
ใช้อัลกอริทึมทั่วไปอย่างกว้างขวางโดยเฉพาะ:
<algorithm>
<numeric>
<iterator>
<functional>
ใช้งานได้ทุกที่auto
และdecltype()
ได้รับประโยชน์ โดยเฉพาะอย่างยิ่งเมื่อคุณต้องการที่จะประกาศสิ่ง แต่ชนิดที่คุณไม่สนใจเกี่ยวกับเช่น iterator auto
หรือประเภทแม่แบบที่ซับซ้อนการใช้งาน decltype()
เมื่อคุณต้องการที่จะประกาศสิ่งในแง่ของประเภทของสิ่งอื่นใช้
ทำสิ่งต่าง ๆ ที่ปลอดภัยเมื่อคุณสามารถ เมื่อคุณมีคำยืนยันที่บังคับใช้ค่าคงที่กับสิ่งใดประเภทหนึ่งตรรกะนั้นสามารถรวมศูนย์ในรูปแบบใดประเภทหนึ่งได้ และนี่ไม่จำเป็นต้องทำสำหรับค่าใช้จ่ายรันไทม์ใด ๆ นอกจากนี้ควรไปโดยไม่บอกว่าควรใช้สไตล์แบบ C ( (T)x
) เพื่อหลีกเลี่ยงความชัดเจน (และสามารถค้นหาได้!) C ++ - สไตล์คาสท์ (เช่น, static_cast
)
ในที่สุดรู้ว่ากฎของสาม:
- destructor
- คัดลอกคอนสตรัค
- ผู้ประกอบการที่ได้รับมอบหมาย
ได้กลายเป็นกฎข้อที่ห้าด้วยการเพิ่มตัวสร้างการย้ายและตัวดำเนินการกำหนดการย้าย และเข้าใจการอ้างอิงค่า rvalue โดยทั่วไปและวิธีหลีกเลี่ยงการคัดลอก
C ++ เป็นภาษาที่ซับซ้อนดังนั้นมันจึงเป็นเรื่องยากที่จะอธิบายลักษณะวิธีการที่ดีที่สุดที่จะใช้ทั้งหมดของมัน แต่แนวทางการพัฒนา C ++ ที่ดีนั้นไม่ได้เปลี่ยนพื้นฐานด้วย C ++ 11 คุณควรยังคงชอบคอนเทนเนอร์ที่มีการจัดการหน่วยความจำมากกว่าการจัดการหน่วยความจำด้วยตนเองตัวชี้สมาร์ททำให้ง่ายต่อการทำเช่นนี้
ฉันจะบอกว่า C ++ ที่ทันสมัยเป็นอิสระจากการจัดการหน่วยความจำแบบแมนนวลส่วนใหญ่ข้อดีของรูปแบบหน่วยความจำของ C ++ ก็คือมันสามารถกำหนดได้ การจัดสรรคืนที่คาดการณ์ได้ทำให้มีประสิทธิภาพที่คาดการณ์ได้มากขึ้น
สำหรับคอมไพเลอร์นั้น G ++ และ Clang นั้นทั้งคู่แข่งขันกันในแง่ของคุณสมบัติ C ++ 11 และทันกับข้อบกพร่องของพวกเขาอย่างรวดเร็ว ฉันไม่ได้ใช้ Visual Studio ดังนั้นฉันจึงไม่สามารถพูดหรือทำเพื่ออะไร
ในที่สุดหมายเหตุเกี่ยวกับstd::for_each
: หลีกเลี่ยงโดยทั่วไป
transform
, accumulate
และerase
- remove_if
เป็นสิ่งที่ดีเก่าทำงานmap
, และfold
filter
แต่for_each
เป็นเรื่องทั่วไปมากกว่าและมีความหมายน้อยกว่า - มันไม่ได้แสดงเจตนาใดๆ นอกเหนือจากการวนซ้ำ นอกจากนั้นก็ใช้ในสถานการณ์เดียวกับช่วง-based for
และเป็นไวยากรณ์หนักแม้ในขณะที่ใช้จุดฟรี พิจารณา:
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);