ฉันเข้าใจไวยากรณ์และความหมายทั่วไปของพอยน์เตอร์กับการอ้างอิง แต่ฉันจะตัดสินใจได้อย่างไรว่าควรจะใช้การอ้างอิงหรือพอยน์เตอร์ใน API เหมาะสมกว่าหรือน้อยกว่านั้น
โดยปกติแล้วบางสถานการณ์ต้องการหนึ่งหรืออื่น ๆ ( operator++
ต้องการอาร์กิวเมนต์อ้างอิง) แต่โดยทั่วไปฉันพบว่าฉันชอบที่จะใช้พอยน์เตอร์ (และพอยน์เตอร์พอยน์) เนื่องจากไวยากรณ์มีความชัดเจนว่าตัวแปรนั้นผ่านการทำลายล้าง
เช่นในรหัสต่อไปนี้:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
ด้วยตัวชี้จะเห็นได้ชัดว่ามีอะไรเกิดขึ้นอยู่เสมอดังนั้นสำหรับ API และสิ่งที่ความชัดเจนเป็นข้อกังวลที่สำคัญคือตัวชี้ไม่เหมาะสมกว่าการอ้างอิงหรือไม่ หมายความว่าควรใช้การอ้างอิงเมื่อจำเป็นเท่านั้น (เช่นoperator++
)? มีข้อกังวลเกี่ยวกับประสิทธิภาพหรือไม่
แก้ไข (ล้าสมัย):
นอกเหนือจากการอนุญาตให้มีค่า NULL และจัดการกับอาร์เรย์แบบดิบแล้วดูเหมือนว่าตัวเลือกจะลงมาตามความชอบส่วนตัว ฉันยอมรับคำตอบด้านล่างที่อ้างอิงถึงคู่มือสไตล์ C ++ ของ Googleเนื่องจากพวกเขานำเสนอมุมมองที่ว่า "การอ้างอิงอาจทำให้เกิดความสับสนเนื่องจากมีไวยากรณ์ของค่า แต่มีความหมายของตัวชี้"
เนื่องจากการทำงานเพิ่มเติมที่จำเป็นในการฆ่าเชื้ออาร์กิวเมนต์ของตัวชี้ที่ไม่ควรเป็น NULL (เช่นadd_one(0)
จะเรียกรุ่นตัวชี้และตัวแบ่งในระหว่างรันไทม์) มันทำให้รู้สึกจากมุมมองการบำรุงรักษาเพื่อใช้การอ้างอิงที่วัตถุต้องมีอยู่แม้ว่ามันจะเป็นความอัปยศ การสูญเสียความชัดเจนของวากยสัมพันธ์
add_one(a);
เป็นที่ชัดเจนว่าa
's จะได้รับการแก้ไข? มันบอกว่าสิทธิในรหัส: เพิ่มหนึ่ง
addOneTo(...)
นี้ได้รับการแก้ไขโดยการตั้งชื่อเพียงวิธีการที่ ถ้านั่นไม่ใช่สิ่งที่คุณต้องการทำเพียงแค่ดูที่การประกาศ