สิ่งนี้ส่วนใหญ่เน้นที่บรรทัดที่สอง: แนวปฏิบัติที่ดีที่สุดการกำหนดพารามิเตอร์ฟังก์ชัน ฯลฯ
การปฏิบัติทั่วไป พยายามทำทุกสิ่งconst
ที่คุณทำได้ หรือใช้วิธีอื่นทำทุกอย่างconst
ให้เริ่มต้นจากนั้นลบชุดขั้นต่ำconst
ที่จำเป็นเพื่อให้โปรแกรมทำงานได้ สิ่งนี้จะเป็นประโยชน์อย่างมากในการบรรลุความถูกต้องและจะช่วยให้มั่นใจว่าไม่มีการแนะนำข้อบกพร่องที่ละเอียดอ่อนเมื่อผู้คนลองและกำหนดสิ่งที่ไม่ควรแก้ไข
หลีกเลี่ยง const_cast <> เหมือนกาฬโรค มีกรณีการใช้งานที่ถูกต้องตามกฎหมายหนึ่งหรือสองกรณี แต่มีน้อยมากและอยู่ระหว่าง หากคุณพยายามที่จะเปลี่ยนconst
วัตถุคุณจะทำสิ่งต่าง ๆ ได้ดียิ่งขึ้นเพื่อค้นหาผู้ที่ประกาศconst
ในจังหวะแรกและพูดคุยกับพวกเขาเพื่อให้ได้ความเห็นเป็นเอกฉันท์ว่าจะเกิดอะไรขึ้น
ซึ่งนำไปสู่การกำหนดอย่างประณีตมาก คุณสามารถกำหนดเป็นบางอย่างเฉพาะถ้าไม่ใช่แบบคงที่ หากคุณต้องการกำหนดให้เป็นสิ่งที่เป็น const ดูด้านบน จำไว้ว่าในการประกาศint const *foo;
และint * const bar;
สิ่งต่าง ๆ นั้นconst
- คำตอบอื่น ๆ ที่นี่ได้ครอบคลุมปัญหาที่น่าชื่นชมดังนั้นฉันจะไม่เข้าไป
พารามิเตอร์ฟังก์ชั่น:
ผ่านค่า: เช่นvoid func(int param)
คุณไม่สนใจทางเดียวหรืออื่น ๆ ที่เว็บไซต์โทร อาร์กิวเมนต์สามารถทำให้มีกรณีการใช้งานสำหรับการประกาศฟังก์ชั่นเป็นvoid func(int const param)
แต่ที่ไม่มีผลกระทบต่อผู้โทรเพียงในฟังก์ชั่นของตัวเองในสิ่งที่ค่าใด ๆ ที่ถูกส่งผ่านไม่สามารถเปลี่ยนแปลงได้โดยฟังก์ชั่นในระหว่างการโทร
ผ่านการอ้างอิง: เช่นvoid func(int ¶m)
ตอนนี้มันสร้างความแตกต่าง ตามที่เพิ่งประกาศfunc
อนุญาตให้เปลี่ยนแปลงparam
และไซต์การโทรใด ๆ ควรพร้อมที่จะรับมือกับผลที่ตามมา การเปลี่ยนแปลงการประกาศเป็นการvoid func(int const ¶m)
เปลี่ยนแปลงสัญญาและการค้ำประกันที่func
ตอนนี้ไม่สามารถเปลี่ยนแปลงได้param
ซึ่งหมายถึงสิ่งที่ผ่านไปแล้วคือสิ่งที่จะกลับมา ดังที่คนอื่น ๆ สังเกตเห็นว่าสิ่งนี้มีประโยชน์มากสำหรับการส่งวัตถุขนาดใหญ่อย่างถูกที่คุณไม่ต้องการเปลี่ยน ผ่านการอ้างอิงมีราคาถูกกว่ามากผ่านวัตถุขนาดใหญ่ตามค่า
ผ่านตัวชี้: เช่นvoid func(int *param)
และvoid func(int const *param)
สองคนนี้จะสวยมากความหมายเหมือนกันกับคู่อ้างอิงของพวกเขาด้วยข้อแม้ที่ว่าฟังก์ชั่นที่เรียกว่าตอนนี้ต้องมีการตรวจสอบnullptr
เว้นแต่บางอื่น ๆ มั่นใจสัญญารับประกันfunc
ว่าจะไม่ได้รับในnullptr
param
ส่วนความเห็นในหัวข้อนั้น การพิสูจน์ความถูกต้องในกรณีเช่นนี้เป็นเรื่องที่เลวร้ายมันเป็นเรื่องง่ายเกินไปที่จะทำผิดพลาด ดังนั้นอย่าเสี่ยงและตรวจสอบพารามิเตอร์ของตัวชี้nullptr
เสมอ คุณจะช่วยรักษาความเจ็บปวดและความทุกข์ทรมานของตัวเองและยากที่จะหาข้อบกพร่องในระยะยาว และสำหรับค่าใช้จ่ายในการตรวจสอบก็มีราคาถูกและในกรณีที่การวิเคราะห์แบบคงที่ที่สร้างขึ้นในคอมไพเลอร์สามารถจัดการได้เครื่องมือเพิ่มประสิทธิภาพจะกำจัดมันต่อไป เปิดใช้การสร้างรหัสเชื่อมโยงเวลาสำหรับ MSVC หรือ WOPR (ฉันคิดว่า) สำหรับ GCC และคุณจะได้รับโปรแกรมอย่างกว้างขวางเช่นแม้ในการเรียกใช้ฟังก์ชันที่ข้ามขอบเขตโมดูลซอร์สโค้ด
ในตอนท้ายของวันทั้งหมดข้างต้นทำให้เป็นกรณีที่มั่นคงมากที่จะชอบการอ้างอิงถึงพอยน์เตอร์ พวกมันปลอดภัยกว่าทุกรอบ