C++ Nâng Cao. Con Trỏ Hàm
Chào mừng các bạn đến với chủ đề học lập trình c++ mở rộng – nâng cao tại blog: Phát Triển Phần Mềm 123AZ
Bài viết hôm nay chúng ta cùng tìm hiểu về khái niệm con trỏ hàm trong c++
1. Lý Thuyết cơ bản.
– Được sử dụng trong các project dự án phần mềm. Tuy không nhiều nhưng đóng vai trò cần thiết.
– Về cơ bản thì một chương trình lập trình là các mã code, sau khi biên dịch chúng được chuyển thành các mã máy và được sắp xếp trong các địa chỉ của các vùng nhớ của bộ nhớ máy tính.
– Hàm main là hàm chính được coi như điểm đầu vào của chương trình, do đó mã code cho hàm main cũng được lưu trữ tại một địa chỉ vùng nhớ, để chương trình có thể tìm kiếm và thực thi.
– Vậy thì đã là địa chỉ của vùng nhớ thì chúng hoàn toàn có thể được lưu trữ trong một biến gọi là con trỏ.
Như vậy ta thấy rằng. Nếu biến được lưu trữ trong vùng nhớ và được trỏ bởi con trỏ thường
Thì hàm được lưu trữ trong vùng nhớ cũng sẽ được trỏ bởi một loại con trỏ.
Và đó được gọi là con trỏ hàm.
Biến dữ liệu có nhiều loại như là : int, float, double, bool… và chúng được trỏ bởi những con trỏ tương ứng *int, *float, *double…
Vậy thì với hàm cũng có một loại con trỏ riêng đặc biệt dành cho hàm để phân biệt con trỏ hàm với con trỏ các biến thường.
2. Thực hành con trỏ hàm trong c++
Cú pháp khai báo cho 1 con trỏ hàm như sau:
[kiểu trả về] [(* tên con trỏ)] [(danh sách đối số]
Ví dụ:
int (*FunctionPtr)() // con trỏ hàm kiểu trả về int, không có tham số đầu vào.
int (*FuncPtr)(int&, int&) // con trỏ hàm kiểu trả về int, có hai tham số đầu vào tham chiếu int
Ví dụ code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int SumValue(int &value1, int &value2) { return (value1 + value2); } int main() { int (*pSum) (int &, int &) = SumValue; int val1 = 4; int val2 = 5; std::cout << pSum(val1, val2); _getch(); return 0; } |
Một cách khác chúng ta có thể khởi tạo con trỏ hàm trước rồi gán nó sau cũng được
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
int (*pSum) (int &, int &); int SumValue(int &value1, int &value2) { return (value1 + value2); } int main() { pSum = SumValue; int val1 = 4; int val2 = 5; std::cout << pSum(val1, val2); _getch(); return 0; } |
Trong C++ có sự cải tiến và thay đổi cú pháp cho con trỏ hàm như sau:
[std::function][<kiểu trả về (đối số)>] [Tên]
Ví dụ như sau:
std::function <int (int&, int&)> pSum
Thay thế vào ví dụ trên ta có
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream> #include <conio.h> #include <functional> std::function<int (int&, int&)> pSum; int SumValue(int &value1, int &value2) { return (value1 + value2); } int main() { pSum = SumValue; int val1 = 4; int val2 = 5; std::cout << pSum(val1, val2); _getch(); return 0; } |
Phải sử dụng thư viện STL: functional để có thể sử dụng được kiểu dữ liệu function
Con trỏ hàm sử dụng có nhiều thuận lợi cho việc tối ưu code và cải thiện tốc độ chất lượng sản phẩm phần mềm.