返回

揭秘C++可调用对象:透过现象看本质

后端

可调用对象在C++中是一个非常重要的概念,它允许将一个函数或一个对象当作另一个函数的参数来传递,这使得代码更加灵活和易于重用。

在C++中,可调用对象是指任何可以被调用执行的实体,包括函数、类、lambda表达式和函数指针等。这些实体都可以被当作函数的参数来传递,从而可以实现代码的重用和模块化。

函数对象

函数对象是指可以像函数一样被调用的对象。函数对象必须实现operator()函数,该函数可以接受任意数量的参数并返回一个值。函数对象可以用于替代函数指针,因为函数对象可以像函数指针一样被传递给函数,并且可以存储在容器中。

class Adder {
public:
  int operator()(int a, int b) {
    return a + b;
  }
};

int main() {
  Adder adder;
  int sum = adder(1, 2);
  std::cout << "The sum of 1 and 2 is " << sum << std::endl;
  return 0;
}

可调用的类

可调用的类是指可以像函数一样被调用的类。可调用的类必须实现operator()函数,该函数可以接受任意数量的参数并返回一个值。可调用的类可以用于替代函数对象,因为可调用的类可以像函数对象一样被传递给函数,并且可以存储在容器中。

class Adder {
public:
  int operator()(int a, int b) {
    return a + b;
  }
};

int main() {
  Adder adder;
  int sum = adder(1, 2);
  std::cout << "The sum of 1 and 2 is " << sum << std::endl;
  return 0;
}

lambda表达式

lambda表达式是一种匿名函数,它可以像函数对象一样被调用。lambda表达式可以接受任意数量的参数并返回一个值。lambda表达式可以用于替代函数对象和可调用的类,因为lambda表达式更加简洁和易于使用。

auto adder = [](int a, int b) {
  return a + b;
};

int main() {
  int sum = adder(1, 2);
  std::cout << "The sum of 1 and 2 is " << sum << std::endl;
  return 0;
}

函数指针

函数指针是指指向函数的指针。函数指针可以用于替代函数对象、可调用的类和lambda表达式,因为函数指针更加底层和高效。函数指针可以用于实现回调函数和事件处理。

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

int main() {
  int (*adder)(int, int) = add;
  int sum = adder(1, 2);
  std::cout << "The sum of 1 and 2 is " << sum << std::endl;
  return 0;
}

运算符重载

运算符重载是指通过实现operator函数来改变运算符的默认行为。运算符重载可以用于将类对象当作运算符来使用。运算符重载可以用于实现各种各样的功能,例如向量和矩阵的运算。

class Vector {
public:
  int x;
  int y;

  Vector operator+(const Vector& other) {
    Vector result;
    result.x = x + other.x;
    result.y = y + other.y;
    return result;
  }
};

int main() {
  Vector a{1, 2};
  Vector b{3, 4};
  Vector c = a + b;
  std::cout << "The sum of a and b is " << c.x << ", " << c.y << std::endl;
  return 0;
}

可调用对象在C++中是一个非常重要的概念,它允许将一个函数或一个对象当作另一个函数的参数来传递,这使得代码更加灵活和易于重用。可调用对象包括函数对象、可调用的类、lambda表达式、函数指针和运算符重载等。这些实体都可以被当作函数的参数来传递,从而可以实现代码的重用和模块化。