2010-11-10 65 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