Effective C++ ฉบับที่ 3: 55 แนวทางเขียน C++ ให้ปลอดภัยขึ้น
หนังสือของ Scott Meyers ฉบับที่ 3 (Addison-Wesley, 2005) รวม 55 แนวทางสำหรับเขียน C++ บทความนี้สรุปจากสารบัญรายข้อและ Item 27 ที่สำนักพิมพ์เผยแพร่ เพื่อช่วยดูว่าเล่มนี้เหมาะกับระดับของคุณหรือไม่ และควรรู้อะไรเรื่องมาตรฐานภาษาที่ใช้

ขอบเขตของบทความ: สรุปจากสารบัญรายข้อและ Item 27 ที่สำนักพิมพ์เผยแพร่ให้อ่านตัวอย่าง รวมกับข้อมูลหนังสือจากหน้าสำนักพิมพ์และเว็บไซต์ผู้เขียน ยังไม่ได้อ่านข้ออื่นนอกจาก Item 27 ข้อสังเกตเรื่องข้ออื่นมาจากชื่อข้อในสารบัญเท่านั้น
คนที่เขียน C++ ได้แล้วมักเจอปัญหาที่คอมไพเลอร์ไม่เตือน เช่น ทรัพยากรรั่ว destructor ที่ไม่ถูกเรียก หรือการ cast ที่ดูถูกต้องแต่ทำงานกับสำเนาของออบเจกต์ หนังสือเล่มนี้รวบรวมแนวทางสั้น ๆ ที่ช่วยหลีกเลี่ยงปัญหาแบบนั้น โดยจัดเป็นข้อ ๆ ที่อ่านแยกกันได้
หนังสือเล่มนี้ว่าด้วยอะไร
Effective C++: 55 Specific Ways to Improve Your Programs and Designs ฉบับที่ 3 เขียนโดย Scott Meyers อยู่ในชุด Addison-Wesley Professional Computing Series ตีพิมพ์วันที่ 12 พฤษภาคม 2005 ความยาว 320 หน้า ISBN 978-0-321-33487-9 (หน้าหนังสือของ InformIT)
หน้าสำนักพิมพ์ระบุว่าเนื้อหามากกว่าครึ่งเป็นของใหม่เมื่อเทียบกับฉบับก่อน มีบทใหม่ว่าด้วย resource management และ templates และพูดถึง exceptions, design patterns, multithreading และไลบรารี TR1 รวมถึงเปรียบเทียบกับ Java, C# และ C เพื่อช่วยคนที่ย้ายมาจากภาษาเหล่านั้น เว็บไซต์ของผู้เขียนให้คำอธิบายฉบับที่ 3 ในทำนองเดียวกันและมีหน้า errata แยกไว้ (aristeia.com)
เนื้อหาครอบคลุมหัวข้ออะไร
สารบัญแบ่ง 55 ข้อเป็น 9 บท (สารบัญบน InformIT):
บท | ชื่อบท | ข้อ | ตัวอย่างชื่อข้อ |
|---|---|---|---|
1 | Accustoming Yourself to C++ | 1–4 | View C++ as a federation of languages; Use const whenever possible |
2 | Constructors, Destructors, and Assignment Operators | 5–12 | Declare destructors virtual in polymorphic base classes; Handle assignment to self in operator= |
3 | Resource Management | 13–17 | Use objects to manage resources |
4 | Designs and Declarations | 18–25 | Make interfaces easy to use correctly and hard to use incorrectly |
5 | Implementations | 26–31 | Minimize casting; Strive for exception-safe code |
6 | Inheritance and Object-Oriented Design | 32–40 | Make sure public inheritance models "is-a" |
7 | Templates and Generic Programming | 41–48 | Use traits classes for information about types; Be aware of template metaprogramming |
8 | Customizing new and delete | 49–52 | Understand the behavior of the new-handler |
9 | Miscellany | 53–55 | Pay attention to compiler warnings; Familiarize yourself with Boost |
ภาคผนวก B เป็นตารางจับคู่ข้อระหว่างฉบับที่ 2 กับฉบับที่ 3 ซึ่งช่วยคนที่เคยอ่านฉบับเก่า
แนวคิดที่น่าสนใจจาก Item 27
Item 27 Minimize casting เปิดให้อ่านเป็นตัวอย่าง ยาวเจ็ดหน้า (Item 27) และแสดงรูปแบบการเขียนของทั้งเล่มได้ชัด คือเริ่มจากหลักการ ยกโค้ดที่ดูถูกแต่ผิด แล้วจบด้วยสรุปสั้น
cast ทำลายการรับประกันของ type system ผู้เขียนเตือนคนที่มาจาก C, Java หรือ C# ว่าการ cast ในภาษาเหล่านั้นจำเป็นกว่าและอันตรายน้อยกว่าใน C++
ใช้ cast แบบ C++ ได้แก่
const_cast,dynamic_cast,reinterpret_castและstatic_castแต่ละแบบมีหน้าที่ชัดเจน หาในโค้ดได้ง่ายกว่า และช่วยให้คอมไพเลอร์ตรวจการใช้ผิดได้cast สร้างโค้ดตอนรันได้ ผู้เขียนชี้ว่าออบเจกต์เดียวอาจมีที่อยู่มากกว่าหนึ่งค่าเมื่อมองผ่าน pointer ของคลาสแม่และคลาสลูก จึงไม่ควร cast โดยอาศัยสมมติฐานเรื่องการวางหน่วยความจำ
ตัวอย่างที่ผิดแบบเงียบ การ
static_castตัว*thisไปเป็นคลาสแม่เพื่อเรียกฟังก์ชันของคลาสแม่ ไม่ได้เรียกบนออบเจกต์ปัจจุบัน แต่เรียกบนสำเนาชั่วคราว วิธีที่ถูกคือเรียกWindow::onResize()ตรง ๆระวัง `dynamic_cast` อาจช้าในบาง implementation และความต้องการใช้มักบอกว่าการออกแบบมีปัญหา ทางเลือกคือเก็บ pointer ของคลาสลูกใน container โดยตรง หรือย้าย virtual function ขึ้นไปที่คลาสแม่
ข้อสรุปท้ายข้อมีสามประเด็น คือ หลีกเลี่ยง cast เมื่อทำได้ ถ้าจำเป็นให้ซ่อนไว้ในฟังก์ชัน และเลือก cast แบบ C++ แทนแบบเก่า
พื้นฐานที่ควรมีก่อนอ่าน
จาก Item 27 ผู้อ่านควรเขียน C++ ได้แล้วและเข้าใจ class, inheritance, virtual function และ pointer เพราะตัวอย่างใช้แนวคิดเหล่านี้โดยไม่อธิบายพื้นฐาน เว็บไซต์ผู้เขียนเรียกเล่มนี้ว่าเป็นหนังสือ C++ เล่มที่สอง ไม่ใช่เล่มแรกสำหรับเริ่มเรียนภาษา
เหมาะกับใคร และใครควรเริ่มจากเล่มอื่นก่อน
เหมาะ กับนักพัฒนาที่เขียน C++ อยู่แล้ว เช่น งานระบบเทรดหรือไลบรารีคำนวณที่ต้องการประสิทธิภาพ และอยากรู้ว่าจุดไหนของภาษามักทำให้เกิดบั๊ก
ควรอ่านคู่กับเล่มที่ใหม่กว่า เพราะฉบับนี้ออกปี 2005 ก่อนมาตรฐาน C++11 ตัวอย่างใน Item 27 ยังใช้
std::tr1::shared_ptrและtypedefแบบเก่า ผู้เขียนมีหนังสือ Effective Modern C++ ที่ว่าด้วย C++11 และ C++14 แยกต่างหากควรเริ่มจากเล่มอื่นก่อน ถ้ายังไม่เคยเขียน C++ มาก่อน
ข้อจำกัดของข้อมูลที่ใช้ในบทความนี้
อ่านเฉพาะ Item 27 และสารบัญ ข้ออื่นสรุปจากชื่อข้อเท่านั้น
ข้อมูลในแคตตาล็อกของ Libro ใช้ ISBN 9780132702065 ซึ่งเป็นรหัสจาก Google Books ส่วนหน้าสำนักพิมพ์แสดง ISBN ฉบับพิมพ์ 978-0-321-33487-9 ทั้งสองอ้างถึงฉบับที่ 3 ปี 2005 ตามปกในโฟลเดอร์หนังสือ ควรยืนยันรูปแบบไฟล์อีกครั้งตอนสอบถาม
บทความนี้ไม่ได้คอมไพล์หรือทดสอบโค้ดใดในเล่ม
แหล่งอ้างอิง
Effective C++, 3rd Edition · InformIT (Pearson) · ข้อมูลหนังสือ คำอธิบาย และสารบัญรายข้อ
Item 27: Minimize casting (PDF) · Pearson · Item 27 ทั้งข้อ
Scott Meyers: Books · Scott Meyers · คำอธิบายจากผู้เขียนและลิงก์ errata
หนังสือที่กล่าวถึงในบทความนี้

Effective C++
Scott Meyers
สารบัญมี 55 ข้อใน 9 บท ตั้งแต่ const และการจัดการทรัพยากร ไปจนถึง template, inheritance และการปรับแต่ง new/delete
บทความนี้อ่านจบได้ในตัวเอง หนังสือด้านบนคือจุดต่อยอดสำหรับผู้ที่ต้องการศึกษาลึกขึ้น
อ่านต่อ
25 ตุลาคม 2569
Effective Modern C++: 42 แนวทางใช้ C++11 และ C++14 อย่างถูกวิธีหนังสือของ Scott Meyers (O'Reilly, 2014) ว่าด้วยการใช้ฟีเจอร์ของ C++11 และ C++14 เช่น smart pointer, move semantics, lambda และ concurrency บทความนี้สรุปจากสารบัญในระเบียนห้องสมุด หน้าผู้เขียน และ errata
25 ตุลาคม 2569
Designing Data-Intensive Applications: หนังสือระบบข้อมูลสำหรับวิศวกรซอฟต์แวร์หนังสือของ Martin Kleppmann (O'Reilly, 2017) ว่าด้วยหลักคิดและข้อแลกเปลี่ยนเบื้องหลังฐานข้อมูลและระบบกระจาย บทความนี้สรุปจากหน้าผู้เขียน คลังอ้างอิงทางการ และรีวิวที่ระบุชื่อผู้เขียน เพื่อช่วยดูว่าเล่มนี้เหมาะกับงานของคุณหรือไม่
25 ตุลาคม 2569
Fluent Python ฉบับแรก: สำหรับคนที่เขียน Python ได้แล้วและอยากเขียนให้เป็นธรรมชาติขึ้นหนังสือของ Luciano Ramalho (O'Reilly, 2015) ว่าด้วยการเขียน Python 3 แบบ idiomatic ตั้งแต่ data model ไปจนถึง asyncio และ metaclass บทความนี้สรุปจากคำอธิบายหนังสือ ข้อมูลแคตตาล็อก และคลังโค้ดทางการของฉบับแรก
