You are on page 1of 14

1.

Nạp chồng hàm trong C ++

• Đặt vấn đề :
Chúng ta có hàm tính tổng 2 số nguyên:

Vì hàm trên có tham số kiểu số


nguyên (int), nếu chúng ta có nhu cầu tính
tổng 2 số kiểu double , hàm này sẽ không
thực hiện được.
Để giải quyết vấn đề này, chúng ta có thể
tạo ra 2 hàm có tên khác nhau:

Như vậy, ta sẽ có nhiều hàm với các tên gọi khác nhau. Tuy nhiên, việc sử dụng tên như vậy sẽ
gây bất lợi cho người lập trình khi gọi hàm. Nạp chồng hàm (function overloading) ra đời để
giải quyết vấn đề trên.
1
1. Nạp chồng hàm trong C ++

• Khái niệm: Nạp chồng hàm (function overloading) là tính năng của ngôn ngữ C++ (không có
trong C). Kỹ thuật này cho phép sử dụng cùng một tên gọi cho nhiều hàm (có cùng mục đích).
Nhưng khác nhau về kiểu dữ liệu tham số hoặc số lượng tham số.
Giải quyết vấn đề trên:

Chúng ta cũng có thể định nghĩa


các hàm add() với số lượng tham
số khác nhau:

2
1. Nạp chồng hàm trong C ++

• Một số hàm không thể nạp chồng trong C++


1. Hàm chỉ khác nhau kiểu trả về :

Hai hàm trên giống nhau về tham số


(không có), vì vậy trình biên dịch sẽ
báo lỗi

2. Tham số hàm kiểu typedef

Khai báo typedef chỉ là một bí danh (không


phải kiểu dữ liệu mới), vì vậy chương trình
bên sẽ gặp lỗi:

3
1. Nạp chồng hàm trong C ++

• Một số hàm không thể nạp chồng trong C++


3. Tham số hàm kiểu con trỏ * và mảng []
Tham số hàm con trỏ * và mảng [] là tương đương.
Lúc này, khai báo mảng [] được chuyển đổi ngầm
định thành một con trỏ.
Hai hàm trên giống nhau về tham số (int*), vì vậy
trình biên dịch sẽ báo lỗi.
4. Hai hàm có tên trùng nhau mà một trong
số chúng là hàm static
Hai hàm của một class có tên trùng nhau và
một trong số chúng là static

4
1. Nạp chồng hàm trong C ++

• Một số hàm không thể nạp chồng trong C++


5. Tham số hàm kiểu con trỏ * và mảng []
Tham số hàm con trỏ * và mảng [] là tương đương. Lúc này, khai báo mảng [] được chuyển đổi
ngầm định thành một con trỏ.
Hai hàm trên giống nhau về tham số (int*), vì vậy trình biên dịch sẽ báo lỗi.

5
1. Nạp chồng hàm trong C ++

6. Nạp chồng hàm và từ khóa const


Trước tiên chúng ta hãy xem hai ví dụ sau. Chương trình 1 biên dịch thất bại, nhưng
chương trình 2 biên dịch và chạy tốt

6
1. Nạp chồng hàm trong C ++

C++ cho phép nạp chồng hàm với tham số là const chỉ khi tham số const là tham chiếu hoặc con
trỏ. Đó là lý do tại sao chương trình 1 gặp lỗi biên dịch, nhưng chương trình 2 hoạt động.
• Trong chương trình 1, tham số 'i' được truyền theo giá trị, vì vậy 'i' trong fun() là bản sao của 'i'
trong main(). Do đó, fun() không thể sửa đổi 'i' của hàm main(). Vì vậy, không quan trọng việc
'i' được nhận dưới dạng tham số const hay tham số bình thường.
• Khi tham số là tham chiếu hoặc con trỏ, chúng ta có thể sửa đổi giá trị được tham chiếu hoặc
được trỏ tới, do đó chúng ta có thể có hai phiên bản của hàm, một phiên bản có thể sửa đổi giá
trị được tham chiếu hoặc trỏ tới, một phiên bản không thể thay đổi.

Chương trình khai báo có tham số trùng


nhau và giá trị khác nhau cũng không
chạy được.

7
1. Nạp chồng hàm trong C ++
Hàm với basis khác nhau có thể được gọi bởi hai
object khác nhau.
Ví dụ hai biến t1 gọi hàm fun(), biến const t2 gọi hàm
fun() const.
Ứng dụng khi tạo một hàm có kiểu trả là pointer
hoặc địa chỉ là const, một hàm cũng trả về pointer và
địa chỉ nhưng không phải const.

8
1. Nạp chồng hàm trong C ++

7. Nạp chồng hàm với namespaces và thư viện khác nhau


Trước tiên chúng ta hãy xem hai ví dụ sau. Hai chương trình đều chạy được, hàm f() có
tham số truyền vào là khác nhau.

9
Function overloading and return type

• Có thể nạp chồng hàm khi các hàm phải khác nhau về kiểu và số lượng
đối số trong danh sách đối số.
Tuy nhiên, không thể nạp chồng nếu chúng khác 
 nhau về kiểu trả về .

10
Function overloading and return type

• Nạp chồng hàm biểu hiện cho compile-time


polymorphism.
- Trong quá trình biên dịch, ký hiệu hàm sẽ
được kiểm tra. Kiểu trả về của 1 hàm không
ảnh hưởng đến việc nạp chồng hàm.
=> Cùng một ký hiệu hàm với kiểu trả về khác
nhau sẽ không thể nạp chồng.

11
Function overloading:
Cung cấp nhiều định nghĩa về function bằng cách thay đổi số lượng tham số, thay đổi kiểu dữ liệu của tham số,…
• Nó có thể được thực hiện trong lớp cơ sở cũng như lớp dẫn xuất.

4. Function overloading &


Function overriding in C++

12
4. Function overloading & Function overriding in C++

Function overriding:
Định nghĩa lại của function lớp cơ sở trong lớp dẫn xuất của nó với cùng kiểu trả về và các tham số.
• Nó chỉ có thể được thực hiện ở trong lớp dẫn xuất.

13
4. Function overloading & Function overriding in C++

Function Overloading Function Overriding

Kế thừa Có thể xuất hiện mà không cần kế thừa Xuất hiện khi 1 lớp kế thừa từ lớp khác

Tham số Khác nhau về số lượng hay kiểu dữ liệu Giống nhau

Phạm vi Cùng trong 1 phạm vi Trong những phạm vi khác nhau

Hành vi Function cùng tên hoạt động khác Function của lớp dẫn xuất thực hiện 1
nhau tuỳ vào tham số được truyền cho số công việc được thêm hoặc khác với
chúng function của lớp cơ sở

Thực thi Compile time Run time

14

You might also like