C++ 学习...四个区...std::bind
代码区
全局区
栈区
堆区
栈区:函数参数,和局部变量,由编译器决定释放,
不要返回局部变量的地址!!不要返回局部变量的引用!!以下代码会出错:
int* localAddr(){
int a = 10;
return &a;
}
int& localRef(){
int a = 10;
return a;
}
函数指针:
int (*Add1)(int a,int b);
int (*Add2)(int a,int b);
Add1 = &AddFunc;
Add2 = AddFunc;//两种函数指针赋初值方法
cout << (*Add1)(3,2)<<endl; // 5
cout<<Add1(3,2)<<endl;//输出可以加*,也可以不加
std::bind绑定普通函数
double my_divide (double x, double y) {return x/y;}
auto fn_half = std::bind (my_divide,_1,2);
std::cout << fn_half(10) << '\n';
- bind的第一个参数是函数名,普通函数做实参时,会隐式转换成函数指针。因此std::bind (my_divide,_1,2)等价于std::bind (&my_divide,_1,2);
- _1表示占位符,位于
中,std::placeholders::_1;
std::bind绑定一个成员函数
struct Foo {
void print_sum(int n1, int n2)
{
std::cout << n1+n2 << '\n';
}
int data = 10;
};
int main()
{
Foo foo;
auto f = std::bind(&Foo::print_sum, &foo, 95, std::placeholders::_1);
f(5); // 100
}
- bind绑定类成员函数时,第一个参数表示对象的成员函数的指针,第二个参数表示对象的地址。
- 必须显示的指定&Foo::print_sum,因为编译器不会隐式转换对象的成员函数成函数指针,所以必须在Foo::print_sum前添加&;
- 使用对象成员函数的指针时,必须要知道该指针属于哪个对象,因此第二个参数为对象的地址 &foo;