Đây là vấn đề về phong cách.Tại Google (xem Google C++ style guidelines), sau đây sẽ được ưa thích:
bool CalculateSomeValue(
const vector<string>& input, map<string, double>* result);
Điều này là do sử dụng một con trỏ đòi hỏi việc sử dụng rõ ràng của một dấu tại địa điểm cuộc gọi:
CalculateSomeValue(input, &result);
Trái ngược với đường đi nó sẽ được gọi với một loại tham chiếu:
CalculateSomeValue(input, result);
Bằng cách bắt buộc sử dụng dấu và trong trường hợp thông số được sửa đổi, rõ ràng tại trang web gọi appen. Khi sử dụng tài liệu tham khảo, nó sẽ trở nên cần thiết để tra cứu tài liệu cho mỗi và mọi chức năng để biết liệu nó có tiềm năng sửa đổi các tham số đầu vào của nó hay không.
Tuy nhiên, việc sử dụng con trỏ cũng có những nhược điểm của nó. Đặc biệt, việc sử dụng con trỏ có nghĩa là bạn thay đổi trách nhiệm xử lý null từ người gọi, nơi con trỏ sẽ bị bỏ qua (nếu biến là con trỏ và không chỉ là biểu thức địa chỉ với biến cục bộ) cho hàm. Tức là, khi sử dụng loại con trỏ, CalculateSomeValue
cần kiểm tra nullptr
(hoặc cần ghi rõ tài liệu yêu cầu kiểm tra này trong người gọi), trong khi việc sử dụng loại tham chiếu là tự ghi lại tài liệu và chỉ rõ rằng không có giá trị tham chiếu được mong đợi.
Đối situtation đặc biệt này, cá nhân tôi đánh giá cao đề nghị một phương pháp lai:
bool CalculateSomeValue(
const std::vector<std::string>& input,
Output<map<string, double>> result);
... nơi Output<T>
được tạo ra bởi một hàm với chữ ký:
template<typename T> Output<T> WriteTo(T& output_ref);
... và ở đâu Các nhà khai thác quá tải Output<T>
->
, *
, v.v. Điều này về cơ bản buộc các trang web cuộc gọi phải rõ ràng trong thực tế rằng đầu vào sẽ bị đột biến bằng cách yêu cầu:
CalculateSomeValue(input, WriteTo(result));
... như trái ngược với:
CalculateSomeValue(input, result);
... trong khi đồng thời đạt được ngữ nghĩa không null/cú pháp của tài liệu tham khảo.
Con trỏ đến tham chiếu? Thật thú vị ... @ user619237: Thực hiện tìm kiếm 'con trỏ so với tham chiếu' trên StackOverflow và bạn sẽ nhận được nhiều câu trả lời hơn bao giờ hết. :] – Mehrdad
http://stackoverflow.com/questions/114180/pointer-vs-reference – sinek
Bạn thậm chí không cần phải tìm kiếm, chỉ cần nhìn vào bên phải ở phần "Liên quan" :) – sinek