如果我在c ++中声明函数指针,这意味着什么

时间:2010-11-10 06:37:25

标签: c++ function function-pointers

当我在我的代码中声明如下内容时意味着什么:  Foo * foo(); 它给我带来了什么好处? 如你所见,我不是简单的指针变量。 也 如果我在所有方法的c ++源代码中声明它是什么意思,例如:

// Test cpp class 
.

    #include "Foo.h"
    Foo * foo();

    Test::Test() {}
    Test::GetFooMethods()
    {
        foo()->someMethod();
    }
    …
    …

4 个答案:

答案 0 :(得分:7)

Foo * foo();

这不是函数指针。这是一个名为foo的函数的声明,它不接受任何参数并返回指向Foo的指针。

指向此类型函数的指针如下所示:

Foo* (*foo_ptr)() = foo;

答案 1 :(得分:7)

Foo * foo();是对名为foo的函数的声明,它返回指向Foo对象的指针。 不是是一个函数指针。

代码Foo()->someMethod();可能是拼写错误。你可能意味着foo()->someMethod();。在这种情况下,代码调用foo(),如上所述返回指向Foo对象的指针,然后通过该指针调用Foo::someMethod()方法。

如果事实上你确实意味着Foo()->someMethod();事情变得有点疯狂。这意味着首先在堆栈上默认初始化Foo对象。然后调用Foo::operator->(),返回一个具有名为someMethod()的方法的对象,并调用该函数。看看为什么我猜这是一个错字? :)

编辑:

要回答你帖子中的最后一个问题,当你声明一个没有定义它的函数时,你告诉编译器,“我有一个名为foo的函数,它不带参数并返回指向Foo的指针,但我“我不打算告诉你这个功能是如何实现的。”这允许您编写使用该函数的代码,编译器会很高兴。然而,如果你没有某个地方为这个函数提供定义,那么链接器对你来说会非常脾气暴躁。

答案 2 :(得分:1)

就像

一样
int getX();

是一个返回int的函数的声明,所以也是

Foo * foo();

是一个返回Foo指针的函数声明;

答案 3 :(得分:1)

  

当我在我的代码中时,它意味着什么   声明如下:Foo * foo();

Foo * foo();

很难说不知道Foo是什么。

如果Foo是一种类型,例如struct Foo{};,然后声明一个名为'foo'的函数,它返回一个名为Foo的类型的指针。根据您随后的使用情况(以及帖子的标题),您的帖子中也会出现这种情况。

如果Foo是#define,例如#define Foo 1,那么这不是一个声明,而是一个表达式语句,它将1乘以'foo'的返回值,以防为所涉及的操作数类型定义operator *。

  

它给了我什么好处?

在不知道Foo是什么的情况下再说一次。

  

如果我宣布它是什么意思   在c ++源代码中的所有方法

在翻译单元中尽可能高地声明'foo'(如果确实是声明)意味着更大的名称'foo'的暂定范围。

void f1(){g();} // not OK, 'g' not known

void f(){}

void g(){f();}  // OK, f() is known

顺便说一句,Foo(大写字母F)是否有重载的运算符->