[Basic] Nạp chồng hàm, con trỏ hàm, tham số mặc định trong C++

Nạp chồng hàm (overloading)

Nạp chồng hàm là 1 tính năng mới trong C++ (Không có trong C) cho phép ta định nghĩa 2 hàm cùng tên nhưng khác tham số.

Ví dụ:

#include <iostream>

using namespace std;

//Hàm add với 2 parameter kiểu int
int Add (int a, int b)
{
 
   return a + b;
 
}

//Hàm add với 2 parameter kiểu double
double Add(double a, double b)
{
 
   return a + b;
 
}

int main()
{
 
   //Gọi hàm add với 2 parameter kiểu int
   int val = Add(3, 4);
 
   //Gọi hàm add với 2 parameter kiểu double
   double res = Add(5.0, 5.5);
 
   return 0;
 
}

Chú ý:

Hai hàm cùng tên cùng tham số nhưng khác kiểu dữ liệu trả về không phải là nạp chồng hàm, khi đó trình biên dịch sẽ báo lỗi.

Ví dụ:

int Print()
{
 
   //TODO
 
}

void Print()
{
 
   //TODO
 
}

=> Lỗi vì nạp chồng hàm chỉ xem xét parameter không quan tâm đến kiểu trả về.

Tham số mặc định (Default parameter)

Khi khai báo nguyên mẫu hàm hoặc định nghĩa hàm ta có thể gán giá trị mặc định cho parameter của hàm.

Khi ta gọi hàm nếu ta không truyền giá trị cho parameter thì giá trị mặc định sẽ được sử dụng cho parameter đó, nếu ta truyền giá trị cho parameter thì giá trị ta truyền vào sẽ được sử dụng cho parameter.

Ví dụ:

#include <iostream>

using namespace std;

//Hàm Func có tham số mặc định
void Func(int val = 10)
{
 
   cout << "Gia tri cua bien val = " << val << endl;
 
}

int main()
{
 
   //Tham số có giá trị mặc định
   Func();
 
   //Tham số có giá trị bằng đối số truyền vào hàm
   Func(20);
 
   return 0;
 
}

Kết quả:

Gia tri cua bien val = 10
 Gia tri cua bien val = 20

Chú ý:

  • Tham số mặc định phải ở cuối list parameter

Ví dụ:

//OK
void Func(int val1, int val2 = 10, int val3 = 20)
{
 
   //TODO
 
}

//Error:
void Func(int val1, int val2 = 10,int val3, int val4 = 20)
{
 
   //TODO
 
}
  • Nếu hàm có khai báo nguyên mấu, thì default chỉ khai báo 1 lần khi khai báo nguyên mẫu hoặc định nghĩa hàm.

Ví dụ:

//Khai báo nguyên mẫu hàm
void Func(int val);

//Dịnh nghĩa hàm
void Func(int val = 10)
{
 
   //TODO
 
}

Hoặc

//Khai báo nguyên mẫu hàm
void Func(int val = 10);
 
//Dịnh nghĩa hàm
void Func(int val)
{
 
   //TODO
 
}

Con trỏ hàm

Biến con trỏ giữ địa chỉ của biến

Con trỏ hàm giữ đia chỉ của hàm. Khi con trỏ trỏ đến địa chỉ của 1 hàm ta có thể gọi hàm đó thông qua con trỏ hàm.

Cú pháp:

kieu_tra_ve (*ten_con_tro) (parameters)

Ví dụ:

#include <iostream>

using namespace std;

//Khai báo con trỏ hàm có kiểu trả về là int, 2 tham số đầu vào kiểu int
int(*FuncPtr)(int, int);

//Định nghĩa hàm Add
int Add(int a, int b)
{
 
   return a + b;
 
}
 
int main()
{
 
   //Gán hàm Add cho con trỏ hàm FuncPtr
   FuncPtr = Add;

   //Sử dụng con trỏ hàm thay thế hàm
   int res = FuncPtr(4, 5);
 
   cout << "Res = " << res << endl;
 
   return 0;
 
}

Kết quả:

Res = 9

Chú ý:

Hàm gán cho con trỏ hàm phải có parameter và kiểu trả về matched với kiểu trả về và kiểu dữ liệu khi khai báo con trỏ hàm.

Ví dụ

int(*FuncPtr)();

//Định nghĩa hàm Add
int Add(int a, int b)
{
 
   return a + b;
 
}

FuncPtr = Add; //Error

Was this article helpful?

Leave A Comment?