智能指针有unique_ptr(独占指针),shared_ptr(共享指针)。
unique_ptr独占式指针,只能由一个智能指针拥有管理指针资源。
shared_ptr则是共享式指针,多个指针对象可以共享同一个指针资源。
C++中,智能指针本质上就是类模板,可以通过定义一个自定义的删除器(Deleter)来指定智能指针在析构时释放资源的方式。智能指针中的删除器可以是一个函数对象(函数指针),函数符或者是Lambda表达式。
函数指针:
函数指针是指向函数的指针变量,可以存储一个函数的入口地址,通过调用该指针变量就可以实现对被指向函数的调用。使用函数指针最常用的场景是作为回调函数,也可以用于实现函数指针数组、函数指针作为函数参数等特殊功能。
// 声明一个返回值为int,带两个int类型参数的函数指针
int (*pfunc)(int, int);
在这个例子中,`int (*pfunc)(int, int)`表示定义了一个指向返回值为int类型、带两个int类型参数的函数指针。我们可以将pfunc指向符合这个函数类型的函数,调用该函数指针时,实际上就是调用被指向函数。
函数符:
函数符是一个重载调用运算符 operator()
的对象或模板类实例,通常称为仿函数(Functor)。函数符可以像函数一样被调用,可以接受参数并返回结果,具有更大的灵活性和自定义性。函数符常用于算法、容器、迭代器等STL模板中。
// 一个返回值为int类型的函数符
struct MyFunc {
int operator() (int a, int b) const { return a + b; }
};
在这个例子中,定义了一个名为MyFunc
的函数符,重载了函数调用运算符operator()
。当函数符对象被调用时,实际上就是在调用这个运算符重载函数。
Lambda表达式
Lambda函数是一种匿名函数,它的定义方式类似于一个函数,但没有名字,可以使用[]
包围的捕获列表来捕获外部变量,在()
中指定函数参数,在{}
中定义函数体。Lambda函数的特点是在定义时生成一个可调用对象,可以将这个对象赋值给一个变量,也可以作为其他函数的参数或返回值,实现了代码更加简洁、易读的目的。
auto func = [](int a, int b) { return a + b; };
在这个例子中,定义了一个匿名函数,通过[]
捕获列表捕获外部变量,()
中定义函数参数列表,{}
中定义函数体,赋值给了一个变量func
。可以像调用函数一样使用func(1, 2)
来调用Lambda函数。
总之,函数指针、函数符、Lambda函数都是实现函数调用的方法,它们在应用场景和使用方式上有所区别,在具体编程中可以根据需要进行选择。