0

Callable

Trong C++, Callable là một khái niệm rộng chỉ bất kỳ thứ gì có thể được gọi giống như một hàm.

Dưới đây là các loại Callable phổ biến trong c++

  • Hàm thông thường (Regular function): Đây là loại Callable cơ bản nhất, được định nghĩa bằng int, void, ... theo sau là tên hàm, danh sách tham số và thân hàm. Ví dụ:
int add(int a, int b) { return a + b;}
  • Con trỏ hàm (Function pointer): lưu trữ địa chỉ bộ nhớ của một hàm. Được sử dụng để gọi hàm mà con trỏ hàm đang trỏ tới. Ví dụ:
int (*func_ptr)(int, int) = add;
int sum = func_ptr(3,5);
  • Đối tượng hàm (Function object hay Functors)
    • Đây là đối tượng của 1 lớp (class, struct) mà lớp đó định nghĩa toán tử gọi hàm operator().
    • Toán tử operator() cho phép ta gọi đối tượng của lớp đó giống như một hàm.
    • Đối tượng hàm có thể lưu trữ trạng thái (dữ liệu thành viên), điều mà hàm thông thường hay con trỏ hàm không thể làm được. Ví dụ:
struct Multiplier{
    int factor; // lưu trữ dữ liệu thành viên
    Multiplier(int _factor) : factor(_factor) {}
    int operator()(int x) const {
        return x * factor;
    }
};

Multiplier mul(5); 
int result = mul(10);
  • Lambda Expressions (Biểu Thức Lambda)
    • Là một cách ngắn gọn để định nghĩa các đối tượng hàm ẩn danh (không tên).
    • Thường được sử dụng để truyền các đoạn mã nhỏ vào các hàm khác. Ví dụ:
auto square = [](int x) {return x * x;}
int reuslt = square(7);
  • Con trỏ đến hàm thành viên (Pointers to Member Functions)
    • Là trỏ tới một phương thức của một lớp (class).
    • Để gọi một phương thức thông qua con trỏ đến thành viên hàm, bạn cần có một đối tượng cụ thể của lớp đó. Ví dụ:
struct MyClass {
    int value;
    MyClass(int v) : value(v) {}
    int getValue() const { return value; }
};

int (MyClass::*get_value_ptr)() const = &MyClass::getValue;
MyClass obj(42);
int val = (obj.*get_value_ptr)(); // Gọi phương thức thông qua con trỏ đến thành viên hàm

All rights reserved

Bình luận

Đăng nhập để bình luận
Avatar
0
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí