Jul 3

Khái niệm Nạp Chồng Overloading Không rõ

_Cute , 15:23 , C#,WPF,Silverlight , Via Tự viết Lớn | Vừa | Nhỏ
Khái niệm về sự nạp chồng (overloading)
nạp có nghĩa là nạp lên bộ nhớ. Chồng có nghĩa là đè lên cái gì đó. Vậy hiểu nôm na nạp chồng có nghĩa là nạp một cái mới đè lên vị trí bộ nhớ của một cái cũ.
Nạp chồng hàm (function overloading)
Theo như nghĩa trên, nạp chồng hàm là nạp một hàm mới đè lên vị trí bộ nhớ của một hàm đã được nạp rồi. Tất nhiên với điều kiện 2 hàm này phải trùng tên.
Tuy nhiên, trùng tên mới chỉ là điều kiện cần để phát sinh sự kiện nạp chồng. Điều kiện đủ là 2 hàm này phải có sự khác nhau về:
- hoặc là kiểu dữ liệu trả về (return data type)
- hoặc là số lượng tham số (parameter)
- hoặc là kiểu dữ liệu của tham số (parameters data type)
Điều này cũng dể hiểu vì nếu 2 hàm giống nhau hoàn toàn thì việc gì phải viết 2 lần (và nếu viết 2 lần bạn sẽ nhận được thông báo lỗi trùng tên khai báo khi dịch chương trình)

Ví dụ về nạp chồng hàm
Tôi có hàm funcong làm chức năng cộng 2 số nguyên do tôi truyền vào.

int funcong(int a, int b)
{
return(a + b);
}

hàm main để sử dụng hàm tính cộng này như sau

void main()
{
cout<<"tong cua 2 va 3 la: "<<funcong(2,3)<<endl;
}

Kết quả là 5; Bây giờ giả sử tôi muốn tính tổng của 2 số thực thì sao?

Cách đơn giản tôi viết thêm một hàm cộng khác dành cho số thực,

float funcong2(float a, float b)
{
return (a + b);
}

và lúc đó, gọi hàm này tôi có thể truyền vào 2 số thực

funcong2(1.5, 2.5)

[B]Bạn thấy gì khi làm như vậy?

- tôi phải nhớ tên của 2 hàm, và tham số tương ứng của mỗi hàm cùng làm nhiệm vụ cộng. Điều này có nghĩa là có khả năng tôi phải nhớ tên gọi hàm, và tham số của 5 -7 hàm cùng làm 1 nhiệm vụ.

- chương trình của tôi chiếm 2 lần bộ nhớ để nạp 2 hàm. Và như vậy nếu tôi có 5 hàm cộng, tôi mất 5 lần bộ nhớ

Giải quyết điều này như thế nào?

Để giải quyết điều này, các nhà phát triển ngôn ngữ C đưa ra kỹ thuật overloading. Như đã đề cập, overloading sẽ nạp các hàm trùng tên vào một vị trí bộ nhớ duy nhất(tất nhiên là nạp tuần tự, cần hàm nào thì nạp hàm đó). Và tôi cũng chỉ cần nhớ tên 1 hàm cho một nhiệm vụ. Như bạn thấy ở ví dụ sau.

Ví dụ này tôi viết lại ví dụ trên theo cách nạp chồng, bạn so sánh sẽ thấy khác biệt

float funcong(int a, int b)
{
return(a + b);
}

float funcong(float a, float b)
{
return (a + b)
}

void main()
{
cout<<"2 cong 3 = "<<funcong(2,3)<<endl;
cout<<"2.5 cong 3.5 ="<<funcong(2.5, 3.5)<<endl;
}

Như bạn thấy đó, tôi không cần quan tâm đến tên hàm nữa vì tôi chỉ có 1 hàm làm nhiệm vụ cộng duy nhất funcong

Khi tôi truyền vào các số nguyên, chương trình sẽ nạp hàm funcong(int a, int b) vào bộ nhớ và xử lý tính toán. Còn khi tôi truyền vào các số thực, chương trình sẽ nạp hàm funcong(float a, float b) vào cùng vùng nhớ đã dành cho hàm này (đè lên hàm số nguyên)

Nạp chồng toán tử (operator overloading

Thực ra toán tử cũng chính là các hàm, chẳng qua thay vì đặt tên, người ta đặt ký hiệu (+, - , *, /, %...) cho dể nhớ và dể trình bày. Các ký hiệu này được gọi là toán tử. Chẳng hạn thay vì đặt tên là funcong tôi đặt là + cho dể lập trình. Tuy nhiên phải khai báo các toán tử đúng với quy định về cú pháp. Thông thường, người ta nạp chồng toán tử để bổ sung phép toán cho các lớp (class).

Lấy ví dụ toán tử + hay - đã được lập trình sẵn trong C/++, bây giờ tôi có một lớp chuỗi (string.h) và tôi muốn viết
stringC = stringA + stringB để nối 2 chuỗi A, B tạo thanh chuỗi C.
nhưng phép cộng(+) không dùng được cho kiểu chuỗi, vậy tôi phải viết hàm mới cho toán tử cộng trong lớp string nhằm để cộng 2 chuỗi với nhau. ví dụ này bạn có thể xem trong phần Help.

Bài viết sưu tầm

Bài viết số 611 đã được: 3.3/10 (60 Đánh giá)

Bình Luận Qua Facebook
Chia Sẻ: Google Bookmarks Yahoo Bookmarks Đăng lên ZingMe Đăng lên Linkhay Đăng lên TagVn Bookmarks lêb baibu



     [3514] Đồ họa C++ : Hai chiếc xe đụn nhau ( 9/11/2009 )
     [2655] Cách điều chỉnh để Borland C++ 3.1 chạy mượt trên Windows XP   ( 12/10/2009 )
     [4603] Borland C++ 3.1 tự động cài đặt có sẵn bài tập đã giải từ A-Z ( 12/10/2009 )
     [2106] Ôn thi cấu trúc dữ liệu câu 8 ( 22/12/2008 )
     [2158] Ôn thi cấu trúc dữ liệu câu 7 ( 22/12/2008 )
     [1527] Ôn thi cấu trúc dữ liệu câu 6 ( 22/12/2008 )
     [1653] Ôn thi cấu trúc dữ liệu câu 3 ( 18/12/2008 )
     [1767] Ôn thi cấu trúc dữ liệu Câu 2 ( 18/12/2008 )
     [2075] CÂy tree ( 17/12/2008 )
     [1638] Ôn thi Cấu trúc dữ liệu Câu 5 ( 14/12/2008 )
     [1527] Ôn thi Cấu trúc dữ liệu Câu 4 ( 14/12/2008 )
     [1484] Ôn thi Cấu trúc dữ liệu Câu 1 ( 14/12/2008 )
     [1769] Chương trình Borland C ( 22/11/2008 )
     [1770] Bài giải đề thi tin A2 và CSLT ( 19/11/2008 )
     [1945] Lập trình C trên Windows (Tiếng Việt) ( 2/11/2008 )
     [7546] Tìm giá trị lớn nhất của 3 số nhập vào ( 16/6/2008 )
     [5342] In ra N số nguyên tố đầu tiên ( 16/6/2008 )
     [2214] Ma trận xoáy trôn ốc ( 16/6/2008 )
     [1574] Bài tập 1 ( 16/6/2008 )
 

Tên gọi:

Địa chỉ web:

Email:

You can also login with your OpenID:
Mở HTML Mở UBB Mở hình vui Ẩn giấu Hãy nhớ [Đăng nhập] [Đăng ký]