ToB企服应用市场:ToB评测及商务社交产业平台

标题: 深入理解C++ 中的可调⽤对象 [打印本页]

作者: 北冰洋以北    时间: 2024-7-14 13:31
标题: 深入理解C++ 中的可调⽤对象
可调用对象用处⼴泛:

满足以下条件的为可调用对象:

普通函数

  1. int add(int a, int b) {
  2.         return a + b;
  3. }
  4. int main() {
  5.         int num1, num2;
  6.         std::cout << "Enter two numbers: ";
  7.         std::cin >> num1 >> num2;
  8.         int sum = add(num1, num2);
  9.         std::cout << "The sum of " << num1 << " and " << num2 << " is: " << sum << s << "\n";
  10.         return 0;
  11. }
复制代码
类成员函数

  1. #include <iostream>
  2. using namespace std;
  3. class Box{
  4. public:
  5.         double length; // ⻓度
  6.         double breadth; // 宽度
  7.         double height; // ⾼度
  8.         // 成员函数声明
  9.         double getVolume(void);
  10.         void setLength( double len );
  11.         void setBreadth( double bre );
  12.         void setHeight( double hei );
  13. };
  14. // 成员函数定义
  15. double Box::getVolume(void)
  16. {
  17.         return length * breadth * height;
  18. }
  19. void Box::setLength( double len )
  20. {
  21.         length = len;
  22. }
  23. void Box::setBreadth( double bre )
  24. {
  25.         breadth = bre;
  26. }
  27. void Box::setHeight( double hei )
  28. {
  29.         height = hei;
  30. }
  31. int main( )
  32. {
  33.         Box box; // 声明 box,类型为 Box
  34.         double volume = 0.0; // ⽤于存储体积
  35.         // 详述
  36.         box.setLength(6.0);
  37.         box.setBreadth(7.0);
  38.         box.setHeight(5.0);
  39.         // 体积
  40.         volume = box.getVolume();
  41.         cout << "box 的体积:" << volume <<endl;
  42.         return 0;
  43. }
复制代码
类静态成员函数

类中的静态成员函数作⽤在整个类的内部,类静态成员函数属于类而非对象。静态成员函数只能访问对应类内部的静态数据成员(由于静态成员函数没有this指针)。类的static函数在类内声明、类外界说时,类内利用static修饰,类外则不能加static关键字,否则会出现编译错误。
  1. class Box{
  2. private:
  3.         int _non_static;
  4.         static int _static;
  5. public:
  6.         int a(){
  7.                 return _non_static;
  8.         }
  9.         static int b(){
  10.                 //_non_static=0; 错误
  11.                 //静态成员函数不能访问⾮静态成员变量
  12.                 return _static;
  13.         }
  14.         static int f(){
  15.                 //a(); (不对,静态成员函数不能访问⾮静态成员函数)
  16.                 return b();
  17.         }
  18. };
  19. int Box::_static= 0;// static静态成员变量可以在类的外部修改
  20. int main(){
  21.         Box box;
  22.         Box* pointer=&box;
  23.         box.a();
  24.         pointer->a();
  25.         Box::b(); // 类名::静态成员函数名
  26.         return 0;
  27. }
复制代码
与类成员函数的区别


仿函数

仿函数就是重载了()运算符的类对象,函数功能通过重载()实现。(⾏为雷同函数,故称仿函数)。实际上就是创建⼀个类,该类重载了()运算符,使得类的实例可以像函数⼀样被调⽤。这允许你在函数对象内部生存状态,并在调⽤时执⾏操作。
简单示例

  1. class Foo
  2. {
  3.         void operator()()
  4.         {
  5.                 cout << __FUNCTION__ << endl;
  6.         }
  7. };
  8. int main()
  9. {
  10.         Foo a;
  11.         //定义对象调⽤
  12.         a.operator()();
  13.         //直接通过对象调⽤
  14.         a();
  15.         //通过临时对象调⽤
  16.         Foo()();
  17. }
复制代码
高级用法-状态保持

仿函数可以具有成员变量,因此在多次调用之间可以保持状态。这在算法需要记载或更新某些值的情况下非常有效。
   思量一个例子:对一个vector统计长度小于5的string的个数
  优缺点

优点


函数指针

与数据项相似,函数也有所在。函数的所在就是存储它的机器语⾔代码内存的开始所在。通常情况下,这些所在对⽤⼾⽽⾔并不重要,但对于步伐⽽⾔,却很有⽤。⽐⽅说,可以编写将另⼀个函数的所在作为参数的函数,这样第⼀个函数就可以或许找到第⼆个函数,并运⾏它。与直接调⽤另⼀个函数相⽐,这种⽅法虽然很笨拙,但是它允许在不同的时间传递不同函数的所在,这也就意味着可以在不同的时间使⽤不同的函数。
获取函数所在

函数名,不加()
声明并调用函数指针

利用using而非old style声明函数指针!
留意两种方式绑定函数的区别!
  1. #include<iostream>
  2. int add(int a, int b) {
  3.     return a + b;
  4. }
  5. int main() {
  6.     // 使用 using 声明函数指针类型
  7.     using AddFunctionPtr = int (*)(int, int);
  8.     // 创建函数指针变量并指向 add 函数
  9.     AddFunctionPtr my_add_function = &add;
  10.     // 使用函数指针调用 add 函数
  11.     int result = my_add_function(3, 4);
  12.     return 0;
  13. }
复制代码
  1. #include<iostream>
  2. int add(int a, int b) {
  3.     return a + b;
  4. }
  5. int main() {
  6.     // 使用 old style 声明函数指针
  7.         int (*my_add_function )(int, int);
  8.     // 指向 add 函数
  9.     my_add_function = &add;
  10.     // 使用函数指针调用 add 函数
  11.     int result = my_add_function(3, 4);
  12.     // int result = (*my_add_function)(3, 4);        // ok
  13.     return 0;
  14. }
复制代码
lambda表达式

Lambda表达式是Modern C++的⼀个语法糖 。 Lambda表达式用于构造闭包:可以或许捕获作用域中的变量的无名函数对象。
语法界说

  1.   [捕获列表]     [前属性]       [形参列表] [说明符]   [异常]         [后属性]        [返回类型]         [约束]       [函数体]
  2. [capture list] front-attr(opt) (params) specs(opt) exception(opt) back-attr(opt) railing-type(opt) requires(opt) {body}
复制代码
捕获

捕获 是一个含有>=0个捕获符 的逗号分隔列表,可以默认捕获符 开始。捕获列表界说了可以从 lambda 函数体之内访问的外部变量。默认捕获符只有&(按引用) 和 =(按复制),它们都将隐式捕获被利用的自动存储期变量(函数能看到的任一变量)。
留意:以默认捕获符隐式捕获的当前对象(*this),将始终按引用捕获,纵然默认捕获符是 =。
单个捕获符


std::function()

协程


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4