& function_name在以下代码

时间:2017-11-06 11:43:57

标签: c++

我有以下代码段, &main&user在这里描述了什么? 每次我运行它为什么给出不同的值? 在什么情况下传递& function_name是有用的?

int user()
{
      return 0;  
}

int main()
{
    int a, b = 0;
    a = ((int)&main);
    b = ((int)&user);
    cout << a <<" " << b;
    return 0;
}

2 个答案:

答案 0 :(得分:0)

它描述了你的功能的地址。每次运行它的原因各不相同,是因为你的程序每次都可能没有使用相同的内存空间。

&amp; main为您提供主函数的地址,就像&amp; var给出了一个名为var的变量的地址。强制转换为int可能存在问题。 64位系统上的指针是64位宽,int可能不会那么长。

答案 1 :(得分:0)

sbi很好地解释了here

  

大多数示例归结为 回调 :您调用函数f()   传递另一个函数g()的地址,f()调用g()   对于某些特定任务。如果您通过f()地址h()   相反,然后f()会回拨h()

     

基本上,这是一种 参数化 函数的方法:某些部分   它的行为不是硬编码到f()中,而是硬编码到回调中   功能。调用者可以通过传递使f()表现不同   不同的回调函数。经典是来自C的qsort()   标准库,它将排序标准作为指向a的指针   比较功能。

     

在C ++中,这通常是使用 函数对象 完成的(也称为   仿函数)。这些是重载函数调用操作符的对象,   所以你可以称它们为功能。示例:

class functor {
  public:
     void operator()(int i) {std::cout << "the answer is: " << i << '\n';}
};

functor f;
f(42);
     

这背后的想法是,与函数指针不同,它是一个函数   对象不仅可以携带算法,还可以携带数据:

class functor {
  public:
     functor(const std::string& prompt) : prompt_(prompt) {}
     void operator()(int i) {std::cout << prompt_ << i << '\n';}
  private:
     std::string prompt_;
};

functor f("the answer is: ");
f(42);
     

另一个优点是内联调用有时更容易   函数对象比通过函数指针调用。这是一个   之所以在C ++中排序有时比在C中排序更快。