2010-11-10 63 views
2

这是什么意思,当我在我的代码中声明如下: Foo * foo(); 它给我带来了什么好处?如你所见,Ist不是简单的指针变量。 此外 是什么意思,如果我在C++源上方例如所有方法声明它:这是什么意思,如果我在C++中声明函数指针

// Test cpp class 
. 

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

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

你的书有什么要说的? – GManNickG 2010-11-10 06:56:02

回答

7

Foo * foo();是声明了一个名为foo它返回一个指向Foo目标函数。它是而不是的一个函数指针。代码Foo()->someMethod();可能是一个错字。你的意思可能是foo()->someMethod();。在这种情况下,代码调用foo(),如上所述返回指向Foo对象的指针,然后通过该指针调用Foo::someMethod()方法。

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

编辑:

要回答在文章的最后一个问题,当你声明一个函数没有定义它,你告诉编译器,“我有一个功能叫foo不带参数和返回一个指向Foo的指针,但我不会告诉你该函数是如何实现的。“这允许您编写使用该函数的代码,编译器会很高兴。但是,如果你不在某个地方提供这个功能的定义,链接器会对你非常暴躁。

+0

啊;很好的抓住首都'F'。 – 2010-11-10 06:43:45

+0

@James:ty,很好的解释一个函数指针真的会是什么样子。 – 2010-11-10 06:49:59

+0

修正了这个类型,所以它就像Foo * foo = new Foo()? – user63898 2010-11-10 07:29:54

7
Foo * foo(); 

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

的指针,这种类型的功能将类似于:

Foo* (*foo_ptr)() = foo; 
1

就像

int getX(); 

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

Foo * foo(); 

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

1

这是什么意思,当我在我的代码 宣布类似于:Foo * foo();

Foo * foo(); 

非常强硬地说,而不知道什么是富。

如果Foo是一种类型,例如struct Foo{};,那么这将声明一个名为'foo'的函数,它返回一个指向某种类型的指针Foo。根据您以后的使用情况(以及帖子的标题),您的帖子看起来就是这种情况。

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

它给我带来了什么好处?

很难再说不知道Foo是什么。

而且这是什么意思,如果我声明它在c ++源上方的所有方法

声明“富”(如果它确实是一个声明)尽可能高在翻译单元的装置名字'foo'的试探性范围更大。

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

void f(){} 

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

顺便说一句,确实Foo(CAPS F)有一个重载操作->

+0

+1用于说明人们使用宏时发生的疯狂事情。 – 2010-11-10 07:10:47