Trong lập trình, nạp chồng toán tử (tiếng Anh: operator overloading), thỉnh thoảng còn được gọi đa hình tùy biến toán tử (operator ad hoc polymorphism), là một trường hợp đặc biệt của đa hình, trong đó các toán tử khác nhau có cách cài đặt khác nhau dựa vào tham số của chúng. Nạp chồng toán tử thường do ngôn ngữ lập trình hoặc lập trình viên định nghĩa.

Cơ sở hình thành

sửa

Nạp chồng toán tử là dạng cú pháp đặc biệt, và được sử dụng bởi vì nó cho phép lập trình bằng các kí hiệu gần với "miền mục tiêu" hơn[1] và cho phép các kiểu do người dùng định nghĩa được hỗ trợ ở một mức độ nhất định về cú pháp giống với các kiểu có sẵn của một ngôn ngữ. Ví dụ, trong tính toán khoa học, nạp chồng toán tử cho phép thao tác với biểu diễn của các đối tượng toán học bằng cú pháp giống như khi viết trên giấy.

Nạp chồng toán tử không làm thay đổi sức mạnh biểu đạt của một ngôn ngữ (hỗ trợ hàm), bởi vì nó cũng giống như việc gọi các hàm vậy. Chẳng hạn, xét các biến a, bc của một kiểu do người dùng định nghĩa, chẳng hạn như ma trận:

a + b * c

Ở trong ngôn ngữ hỗ trợ nạp chồng toán tử, giả sử rằng toán tử nhân '*' có độ ưu tiên cao hơn so với toán tử '+', biểu thức trên là một cách viết súc tích hơn của biểu thức dưới đây:

Cộng(a, Nhân(b, c))

Tuy nhiên, cú pháp đầu tiên phản ánh cách viết thường dùng trong toán học.

Bảng phân loại

sửa

Bảng sau đây phân loại các ngôn ngữ lập trình phổ biến dựa vào việc các ngôn ngữ này có hỗ trợ định nghĩa toán tử mới ngoài các toán tử có sẵn hay không và có hỗ trợ nạp chồng toán tử hay không:

Toán tử Không nạp chồng được Nạp chồng được
Thêm mới được[2]
Bị giới hạn

Xem thêm

sửa

Tham khảo

sửa
  1. ^ Stroustrup, Bjarne. “Operator Overloading”. C++ FAQ. Bản gốc lưu trữ 14 Tháng tám năm 2011. Truy cập 27 Tháng tám năm 2020.
  2. ^ Completely new operators can be added.
  3. ^ Binary functions with a symbolic name can be called infix.
  4. ^ “Predicate op/3”.
  5. ^ Hunt, John (6 tháng 12 năm 2012). Smalltalk and Object Orientation: An Introduction. Springer Science & Business Media. ISBN 978-1-4471-0961-7.
  6. ^ “Bertrand Meyer: Basic Eiffel language mechanisms”. se.ethz.ch. Truy cập 7 Tháng tư năm 2021.
  7. ^ “Operator functions in F90”. www.mathcs.emory.edu. Bản gốc lưu trữ 11 Tháng tám năm 2021. Truy cập 7 Tháng tư năm 2021.
  8. ^ Introduced in Fortran 90.
  9. ^ “3. Language Reference — Futhark 0.19.0 documentation”. futhark.readthedocs.io. Truy cập 10 tháng Mười năm 2020.
  10. ^ Smith, Chris (9 tháng 10 năm 2012). Programming F# 3.0: A Comprehensive Guide for Writing Simple Code to Solve Complex Problems. O'Reilly Media, Inc. ISBN 978-1-4493-2604-3.
  11. ^ Type classes instead of overloading.
  12. ^ “io guide”. iolanguage.org. Truy cập 7 Tháng tư năm 2021.
  13. ^ “Operators”.
  14. ^ “Operators - R in a Nutshell, 2nd Edition [Book]”. www.oreilly.com (bằng tiếng Anh). Truy cập 7 Tháng tư năm 2021.
  15. ^ “Creating operators”.
  16. ^ “Operators”. Tour of Scala.
  17. ^ “Seed7 Manual: Structured syntax definition”. seed7.sourceforge.net. Truy cập 29 tháng Chín năm 2020.
  18. ^ “Swift: Advanced Operators”.
  19. ^ “Why does Go not support overloading of methods and operators?”. Truy cập 4 tháng Chín năm 2011.
  20. ^ “Introduction”. freepascal.org. Truy cập 30 tháng Chín năm 2020.
  21. ^ “Operator Overloads”. GitHub. Truy cập 28 tháng Chín năm 2018.
  22. ^ “6.6 Overloading of Operators”. Annotated Ada Reference Manual.
  23. ^ Drayton, Peter; Albahari, Ben; Neward, Ted (2003). C# in a Nutshell. O'Reilly Media, Inc. ISBN 978-0-596-00526-9.
  24. ^ “C++ Operator Overloading”.
  25. ^ “Eclipse Ceylon: Operator Polymorphism”. ceylon-lang.org. Truy cập 7 Tháng tư năm 2021.
  26. ^ “Operator Overloading - D Programming Language”. dlang.org. Truy cập 10 tháng Mười năm 2020.
  27. ^ “A tour of the Dart language”. dart.dev. Truy cập 30 tháng Chín năm 2020.
  28. ^ “Operator Overloading”. bourabai.kz. Bản gốc lưu trữ 22 Tháng hai năm 2020. Truy cập 7 Tháng tư năm 2021.
  29. ^ “The Apache Groovy programming language - Operators”. groovy-lang.org. Truy cập 30 tháng Chín năm 2020.
  30. ^ “Operator Overloading”. Manifold. Truy cập 7 Tháng sáu năm 2020.
  31. ^ “Operator overloading”. Kotlin. Truy cập 24 Tháng sáu năm 2018.
  32. ^ “Metamethods Tutorial”. Lua-users Wiki.
  33. ^ “Implementing Operators for Your Class”. Truy cập 1 tháng Mười năm 2013.
  34. ^ “Operator Overloading”. Free Pascal Manual. Truy cập 1 Tháng mười hai năm 2014.
  35. ^ “Operator Overloading”. Delphi Manual. Truy cập 1 Tháng mười hai năm 2014.
  36. ^ “PHP magic methods overriding class properties”. Bản gốc lưu trữ 4 Tháng Ba năm 2016. Truy cập 7 Tháng tư năm 2015.
  37. ^ Orwant, Jon (4 tháng 11 năm 2002). Computer Science & Perl Programming: Best of The Perl Journal. O'Reilly Media, Inc. tr. 347–. ISBN 978-0-596-00310-4.
  38. ^ “3. Data Model”. The Python Language Reference.
  39. ^ “Methods”. Official Ruby FAQ.
  40. ^ “Operator Overloading”. Rust By Example.
  41. ^ “How to: Define an Operator (Visual Basic)”. 15 tháng 9 năm 2021.