Nạp chồng toán hạng
Thông tin tài liệu:
Nội dung trích xuất từ tài liệu:
Nạp chồng toán hạng Nạp chồng toán hạng Điểm nổi bật của nạp chồng toán hạng là không phải lúc nào bạn cũng muốn gọi các phương thức hay thuộc tính trên các thể hiện lớp. Chúng ta thường cần làm một số công việc như cộng các số lượng với nhau, nhân chúng hay thực hiện một số toán hạn logic như so sánh các đối tượng. Ví dụ ta định nghĩa một lớp mô tả ma trận toán học. Các ma trận thì có thể cộng, nhân với nhau như các số, nên ta có thể viết đoạn mã như sau: Matrix a, b, c; // assume a, b and c have been initialized Matrix d = c * (a + b); Bằng nạp chồng các toán hạng ta có thể làm cho trình biên dịch biết những gì mà + và * làm đối với một ma trận, và bạn có thể viết đoạn mã như trên. Nếu như không sử dụng toán hạng nạp chồng như trên, ta cũng có thể định nghĩa các phương thức để thực hiện các toán hạng trên nhưng nó sẽ có rất nhiều hỗn độn: Matrix d = c.Multiply(a.Add(b)); Các toán hạng như + và * rất khắc khe với các kiểu dữ liệu định nghĩa trước, và do đó trình biên dịch sẽ tự động biết ý nghĩa của các toán hạng dựa trên các kiểu dữ liệu đó. Ví dụ như nó biết cách để cộng hai số kiểu long, hay cách để chia một số kiểu double cho một số kiểu double. Khi chúng ta định nghĩa lớp hay struct chúng ta phải nói với trình biên dịch mọi thứ như: những phương thức nào có thể được gọi, những trường nào được lưu trữ với mọi thực thể và vân vân. Nếu chúng ta sử dụng các toán hạng như +, * trong lớp của chúng ta. Chúng ta phải nói với trình biên dịch biết ý nghĩa của những toán hạng có liên quan trong ngữ cảnh của lớp đó. Và cách chúng ta làm là định nghĩa nạp chồng cho các toán hạng. Một số trường hợp chúng ta nên viết các toán hạng nạp chồng: 1. Trong thế giới toán học, mọi đối tượng toán học như: tọa độ, vector, ma trận, hàm số và vân vân. Nếu bạn viết chương trình làm những mô hình toán học hay vật lý, bạn nhất định sẽ mô tả những đối tượng này. 2.Những chương trình đồ hoạ sẽ sử dụng các đối tượng toán học và toạ độ khi tính toán vị trí của trên màn hình. 3. Một lớp mô tả số lượng tiền. 4. Việc sử lý từ hay chương trình phân tích văn bản có lớp để mô tả các câu văn, mệnh đề và bạn phải sử dụng các toán hạng để liên kết các câu lại với nhau. Cách hoạt động của các toán hạng : Để hiểu cách nạp chồng toán hạng, chúng ta phải nghĩ về những gì xảy ra khi trình biên dịch gặp một toán hạng - : int a = 3; uint b = 2; double d = 4.0; long l = a + b; double x = d + a; Xem dòng lênh: long l = a + b; Việc thực hiện a+b như trên là rất trực quan, đó là một cú pháp tiện lợi để nói rằng chúng ta đang gọi phương thức cộng hai số. Trình biên dịch sẽ thấy nó cần thiết để cộng hai số nguyên và trả về số kiểu long. Ta thấy đây là phép cộng hai số kiểu integer và kết quả cũng là một số integer nhưng nó ép kiểu sang kiểu long và điều này thì cho phép trong C#. Xét dòng lệnh: double x = d + a; Ta thấy trong nạp chồng này có số kiểu double và kiểu integer, cộng chúng lại và trả về kiểu doube. Chúng ta cần phải đổi kiểu int sang kiểu double sau đó cộng hai số đó lại với nhau. Và chúng ta nhận ra sự nạp chồng của toán tử cộng ở đây như là một phiên bản của toán tử nhận hai số double như hai tham số. Và trình biên dịch phải chắc là nó có thể ép kiểu kết quả về một kiểu thích hợp nếu cần. Xét đoạn mã sau: Vector vect1, vect2, vect3; // initialise vect1 and vect2 vect3 = vect1 + vect2; vect1 = vect1*2; Ở đây vector là một struct, trình biên dịch cần phải cộng hai vector vect1 và vect2 với nhau. Và nó sẽ tìm một nạp chồng của toán hạng + lấy hai vector như tham số của nó. Và toán hạng này trả về một vector khác. Bởi vậy trình biên dịch cần tìm một định nghĩa của toán hạng có dạng như sau: public static Vector operator + (Vector lhs, Vector rhs) Nếu tìm ra nó sẽ thực thi toàn hạng đó. Nếu không nó sẽ sử dụng bất kỳ nạp chồng của toán hạng + nào có hai tham số kiểu dữ liệu khác và có thể chuyển sang thực thể vector. Nếu không tìm được cái nào thích hợp thì nó sẽ báo lỗi. Ví dụ về nạp chồng toán hạng : struct Vector Chúng ta sẽ định nghĩa một struct Vector, nó mô tả một vector ba chiều. Một vector ba chiều là một tập hợp ba con số kiểu double. Các biến mô tả các con số được gọi là x, y, z. Liên kết ba con số lại với nhau và để chúng tạo thành một vector toán học. Sau đây là định nghĩa cho Vector- chứa các trường thành viên, contructor, và một phương thức ToString() overriden, vì thế chúng ta có thể dễ dàng thấy nội dung của một vector và cuối cùng là nạp chồng toán hạn: namespace Wrox.ProCSharp.OOCSharp { struct Vector { public double x, y, z; public Vector(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } public Vector(Vector rhs) { x = rhs.x; y = rhs.y; z = rhs.z; } public override string ToString() { return ( + x + , + y + , + z + ); } Chú ý rằng để làm cho mọi thứ đơn giản thì mọi trường nên được khai báo public. Nên nhớ các struct không cho phép để contructor mặc định. Do đó, tôi đã tạo hai constructor để khởi tạo giá trị cho vector bằng cách truyền giá trị cho mọi phần tử hay truyền một vector khác để sao c hép các giá trị của vector này. Bây giờ hãy xem qua một nạp chồng toán hạng: public static Vector operator + (Vector lhs, Vector rhs) { Vector result = new Vector(lhs); result.x += rhs.x; result.y += rhs.y; result.z += rhs.z; return result; } } } Nó làm việc như thế nào? Cú pháp quan trọng là trong khai báo của toán hạng. Nó được khai báo như cách khai báo một phương thức, ngoại trừ từ khoá operation sẽ nói với trình biên dịch là nó là một nạp chồng toán hạng. Toán hạng được đại diện bởi ký kiệu thực tế cho phù hợp. Kiểu trả về là kiểu mà bạn nhận được khi sử dụng toán hạng này. Trong trường hợp của chúng ta, cộng hai vector sẽ ...
Tìm kiếm theo từ khóa liên quan:
lập trình tài liệu lập trình kỹ thuật lập trình giáo trình C ngôn ngữ lập trình C tự học lập trình với CGợi ý tài liệu liên quan:
-
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 266 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 208 0 0 -
101 trang 200 1 0
-
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 195 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 168 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 153 0 0 -
Tìm hiểu về ngôn ngữ lập trình C: Phần 1 - Quách Tuấn Ngọc
211 trang 149 0 0 -
Giáo trình Lập trình C căn bản - HanoiAptech Computer Education Center
136 trang 134 0 0 -
161 trang 130 1 0
-
Báo cáo thực tập Công nghệ thông tin: Lập trình game trên Unity
27 trang 118 0 0 -
Bài giảng lập trình c căn bản - Trường Apptech - Chương 4
27 trang 118 0 0 -
Giáo trình Vi điều khiển PIC: Phần 1
119 trang 116 0 0 -
Giáo trình về phân tích thiết kế hệ thống thông tin
113 trang 114 0 0 -
Bài giảng Phương pháp lập trình: Chương 9 - GV. Từ Thị Xuân Hiền
36 trang 112 0 0 -
LUẬN VĂN: Tìm hiểu kỹ thuật tạo bóng cứng trong đồ họa 3D
41 trang 109 0 0 -
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 trang 106 0 0 -
150 trang 104 0 0
-
Bài giảng lập trình c căn bản - Trường Apptech - Chương 6
21 trang 103 0 0 -
Đồ án vi xử lý đề tài : nghiên cứu thiết kế mạch đo khoảng cách sử dụng vi điều khiển Pic 16F887
45 trang 97 1 0 -
Giáo trình Lập trình Web với Servlet và JSP: Phần 1
56 trang 96 0 0