当前位置:主页 > 软件编程 > C代码 >

C++知识点之inline函数、回调函数和普通函数

时间:2022-03-03 09:47:42 | 栏目:C代码 | 点击:

一、inline内联函数#

特征

1.1 使用#

声明

// 声明1(加 inline,建议使用)
inline int functionName(int first, int second,...);

定义

// 定义
inline int functionName(int first, int second,...) {/****/};

类内定义

// 类内定义,隐式内联
class A {
int doA() { return 0; } // 隐式内联
}

类外定义

// 类外定义,需要显式内联
class A {
int doA();
}
inline int A::doA() { return 0; } // 需要显式内联

1.2 编译器对 inline 函数处理步骤#

1.3 优缺点#

1.3.1 优点#

1.3.2 慎用内联#

1.3.3 不宜使用内联#

1.4 虚函数(virtual)可以是内联函数(inline)吗?#

如下例程:

#include <iostream>
using namespace std;
class Base
{
    public:
    inline virtual void who()
    {
        cout << "I am Base\n";
    }
    virtual ~Base() {}
};
    
class Derived : public Base
{
    public:
    inline void who() // 不写inline时隐式内联
    {
        cout << "I am Derived\n";
    }
};

int main()
{
// 此处的虚函数 who(),是通过类(Base)的具体对象(b)来调用的,编译期间就能确定了,所以它可以是内联的,但最终是否内联取决于编译器。
Base b;
b.who();

// 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。
Base *ptr = new Derived();
ptr->who();

// 因为Base有虚析构函数(virtual ~Base() {}),所以 delete 时,会先调用派生类(Derived)析构函数,再调用基类(Base)析构函数,防止内存泄漏。
delete ptr;
ptr = nullptr;

system("pause");
return 0;
}

二、回调函数和普通函数#

更详细的回调函数理解可以查看本地的这个文章【【知识点】10张图让你彻底理解回调函数】

2.1 什么是回调函数?#

把a函数指针像参数传递那样传给b函数,而这个a函数会在某个时刻被b函数调用执行,这就叫做回调,a函数称为回调函数。如果回调函数立即被执行就称为同步回调,如果在之后晚点的某个时间再执行,则称之为异步回调。

2.2 为什么要使用回调函数?#

先抛出答案:回调函数的好处和作用,那就是解耦,对,就是这么简单的答案,就是因为这个特点,普通函数代替不了回调函数。

如下代码:

int Callback_1()
{
    printf("Hello");
    printf("This is Callback_1 "); 
    return 0;
}

int Callback_2() 
{
    printf("Hello");
    printf("This is Callback_2 ");    
    return 0;
}

发现以上代码是可以解耦的,因为两个函数都执行了printf("Hello"),这个时候我们可以通过回调的方式进行解耦,如下:

#include<stdio.h>

int Callback_1()    // Callback Function 1
{
    printf("This is Callback_1 "); 
    return 0;
}

int Callback_2()    // Callback Function 2
{    
    printf("This is Callback_2 ");    
    return 0;
}

int Handle(int (*Callback)())
{    
    printf("Entering Handle Function. ");    
    Callback();    
    printf("Leaving Handle Function. ");
}

int main()
{    
    printf("Entering Main Function. ");    
    Handle(Callback_1);    
    Handle(Callback_2);  
    printf("Leaving Main Function. ");    
    return 0;
}

像这样我们就减少了重复代码啦,也就是解耦。这是使用普通函数调用无法做到的。

回调函数和普通函数有什么区别?

1、对普通函数的调用:调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”。

2、对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。

总结

您可能感兴趣的文章:

相关文章