Bước tới nội dung

Nạp chồng toán tử

Bách khoa toàn thư mở Wikipedia

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 | sửa mã nguồn]

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 | sửa mã nguồn]

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

Tham khảo

[sửa | sửa mã nguồn]
  1. ^ Stroustrup, Bjarne. "Operator Overloading". C++ FAQ. Bản gốc lưu trữ ngày 14 tháng 8 năm 2011. Truy cập ngày 27 tháng 8 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 (ngày 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 ngày 7 tháng 4 năm 2021.
  7. ^ "Operator functions in F90". www.mathcs.emory.edu. Bản gốc lưu trữ ngày 11 tháng 8 năm 2021. Truy cập ngày 7 tháng 4 năm 2021.
  8. ^ Introduced in Fortran 90.
  9. ^ "3. Language Reference — Futhark 0.19.0 documentation". futhark.readthedocs.io. Truy cập ngày 10 tháng 10 năm 2020.
  10. ^ Smith, Chris (ngày 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 ngày 7 tháng 4 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 ngày 7 tháng 4 năm 2021.
  15. ^ "Creating operators".
  16. ^ "Operators". Tour of Scala.
  17. ^ "Seed7 Manual: Structured syntax definition". seed7.sourceforge.net. Truy cập ngày 29 tháng 9 năm 2020.
  18. ^ "Swift: Advanced Operators".
  19. ^ "Why does Go not support overloading of methods and operators?". Truy cập ngày 4 tháng 9 năm 2011.
  20. ^ "Introduction". freepascal.org. Truy cập ngày 30 tháng 9 năm 2020.
  21. ^ "Operator Overloads". GitHub. Truy cập ngày 28 tháng 9 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 ngày 7 tháng 4 năm 2021.
  26. ^ "Operator Overloading - D Programming Language". dlang.org. Truy cập ngày 10 tháng 10 năm 2020.
  27. ^ "A tour of the Dart language". dart.dev. Truy cập ngày 30 tháng 9 năm 2020.
  28. ^ "Operator Overloading". bourabai.kz. Bản gốc lưu trữ ngày 22 tháng 2 năm 2020. Truy cập ngày 7 tháng 4 năm 2021.
  29. ^ "The Apache Groovy programming language - Operators". groovy-lang.org. Truy cập ngày 30 tháng 9 năm 2020.
  30. ^ "Operator Overloading". Manifold. Truy cập ngày 7 tháng 6 năm 2020.
  31. ^ "Operator overloading". Kotlin. Truy cập ngày 24 tháng 6 năm 2018.
  32. ^ "Metamethods Tutorial". Lua-users Wiki.
  33. ^ "Implementing Operators for Your Class". Bản gốc lưu trữ ngày 14 tháng 6 năm 2024. Truy cập ngày 1 tháng 10 năm 2013.
  34. ^ "Operator Overloading". Free Pascal Manual. Truy cập ngày 1 tháng 12 năm 2014.
  35. ^ "Operator Overloading". Delphi Manual. Truy cập ngày 1 tháng 12 năm 2014.
  36. ^ "PHP magic methods overriding class properties". Bản gốc lưu trữ ngày 4 tháng 3 năm 2016. Truy cập ngày 7 tháng 4 năm 2015.
  37. ^ Orwant, Jon (ngày 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)". ngày 15 tháng 9 năm 2021.