Tôi hiểu cú pháp và ngữ nghĩa chung của con trỏ so với tham chiếu, nhưng tôi nên quyết định như thế nào khi sử dụng tham chiếu hoặc con trỏ trong API?
Đương nhiên, một số tình huống cần cái này hoặc cái kia ( operator++
cần một đối số tham chiếu), nhưng nói chung tôi thấy tôi thích sử dụng con trỏ (và con trỏ const) vì cú pháp rõ ràng là các biến đang được truyền một cách triệt để.
Ví dụ: trong đoạn mã sau:
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
}
Với con trỏ, luôn luôn (rõ ràng hơn) những gì đang diễn ra, vì vậy đối với các API và tương tự như sự rõ ràng là mối quan tâm lớn là con trỏ không phù hợp hơn tham chiếu? Điều đó có nghĩa là tài liệu tham khảo chỉ nên được sử dụng khi cần thiết (ví dụ operator++
)? Có bất kỳ mối quan tâm hiệu suất với một hoặc khác?
EDIT (NGOÀI):
Bên cạnh việc cho phép các giá trị NULL và xử lý các mảng thô, có vẻ như sự lựa chọn tùy thuộc vào sở thích cá nhân. Tôi đã chấp nhận câu trả lời bên dưới tham khảo Hướng dẫn về Phong cách C ++ của Google , vì họ đưa ra quan điểm rằng "Tài liệu tham khảo có thể gây nhầm lẫn, vì chúng có cú pháp giá trị nhưng ngữ nghĩa con trỏ.".
Do công việc bổ sung cần thiết để vệ sinh các đối số con trỏ không phải là NULL (ví dụ: add_one(0)
sẽ gọi phiên bản con trỏ và ngắt trong thời gian chạy), nên sử dụng các tham chiếu trong đó một đối tượng PHẢI có mặt, mặc dù đó là một sự xấu hổ để mất sự rõ ràng cú pháp.
add_one(a);
không rõ ràng rằng a
sẽ được sửa đổi? Nó nói ngay trong mã: thêm một .
addOneTo(...)
. Nếu đó không phải là điều bạn muốn làm, chỉ cần nhìn vào tờ khai.