25. Truyền tham số theo giá trị, con trỏ (thông minh) hay tham chiếu cho hợp lý

Estimated reading: 4 minutes 275 views

Tóm tắt

Truyền tham số đúng cách: Phân biệt rõ giữa các tham số đầu vào, đầu ra và đầu vào/đầu ra, cũng như giữa truyền theo giá trị và truyền theo tham chiếu. Hãy sử dụng cách truyền phù hợp trong từng trường hợp.

Thảo luận

Việc lựa chọn đúng giữa giá trị, tham chiếu, và con trỏ cho các tham số là một thói quen tốt, giúp tối đa độ an toàn và hiệu suất của chương trình.

Mặc dù hiệu suất không nên là mối quan tâm hàng đầu ngay từ đầu (Mục 8), ta cũng không nên viết mã kém hiệu quả một cách không cần thiết, đặc biệt khi các yếu tố khác như tính rõ ràng mã code đã như nhau rồi (Mục 9).

Dưới đây là những hướng dẫn nên tuân theo khi lựa chọn cách truyền tham số:

Đối với tham số Đầu vào chỉ đọc (input-only):

  • Luôn dùng từ khóa const cho mọi con trỏ hoặc tham chiếu đối với tham số chỉ dùng để đọc.
  • Ưu tiên truyền giá trị đối với các kiểu dữ liệu nguyên thủy (như char, float) hoặc đối tượng nhỏ dễ sao chép (như Point, complex<float>…).
  • Khi truyền tham số đầu vào là kiểu do người dùng định nghĩa (user-defined types), hãy ưu tiên truyền bằng tham chiếu tới const (Ví dụ: const T&) thay vì truyền theo giá trị (T).
  • Xem xét truyền theo giá trị thay vì tham chiếu nếu hàm cần một bản sao của đối tượng truyền vào. Về mặt khái niệm, điều này tương đương với truyền theo tham chiếu đến const rồi sao chép bên trong hàm, và thậm chí giúp trình biên dịch tối ưu tốt hơn bằng cách loại bỏ đối tượng tạm.

→ Chi tiết và Ví dụ

Đối với tham số Đầu ra hoặc Đầu vào/Đầu ra (output hoặc input/output):

  • Ưu tiên dùng con trỏ (hoặc smart pointer) nếu tham số đó không bắt buộc (tức là bên gọi (callers) hàm có thể xử lý giá trị null, như “không có dữ liệu” hoặc “không quan tâm”), hoặc nếu hàm cần lưu lại con trỏ hoặc chuyển quyền sở hữu của tham số.

  • Ưu tiên dùng tham chiếu nếu tham số là bắt buộc, và hàm không lưu lại con trỏ hoặc không thay đổi quyền sở hữu. Điều này thể hiện rõ rằng tham số bắt buộc phải có, và bên gọi chịu trách nhiệm truyền vào đối tượng hợp lệ.

Không nên dùng varargs kiểu C (Mục 98).

Tham khảo

[AlexandrescuO3a] • [Cline99] §2.10-11, 14.02-12, 32.08 • [DeivhurstO3] §57 • [Koenig97] §4 • [Lakos96] §9.1.11-12 • [McConnell93] §5.7 • [Meyers97] §21-22 • [Stroustrup94] §11.4.4 • [StwustrupOO] §5.5, §11.6, §16.3.4 • [SutterOO] §6, §46

Leave a Comment

Chia sẻ:

25. Truyền tham số theo giá trị, con trỏ (thông minh) hay tham chiếu cho hợp lý

Or copy link

CONTENTS