当我在我的代码中声明如下内容时意味着什么: Foo * foo(); 它给我带来了什么好处? 如你所见,我不是简单的指针变量。 也 如果我在所有方法的c ++源代码中声明它是什么意思,例如:
// Test cpp class
.
#include "Foo.h"
Foo * foo();
Test::Test() {}
Test::GetFooMethods()
{
foo()->someMethod();
}
…
…
答案 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)是否有重载的运算符->
?