我有一个由第三方编写的课程,类似于这个Foo.h:
class Foo
{
public:
int Foo::dosomething(float x, float y, float z);
//Other things here
};
在Foo.cpp中,dosomething是:
int Foo::dosomething(float x, float y, float z)
{
//Something
}
标题中函数名前的::
是什么意思?当我创建一个新对象
Foo foo;
我无法访问dosomething函数:
foo.dosomething(1,2,3);
dosomething是如何被访问的?当我在dosomething之前删除头文件中的:::
class Foo
{
public:
int dosomething(float x, float y, float z);
//Other things here
};
我可以从Foo类型的对象访问dosomething。
答案 0 :(得分:5)
将范围添加到类定义中的函数名是不正确的(并且许多编译器认为这是一个错误)。由于它已经在类的范围内,因此您实际上将函数范围定义为Foo::Foo::dosomething
,这是错误的。
class Foo
{
public:
int Foo::dosomething(float x, float y, float z); // Shouldn't have Foo::
};
要回答关于::
的作用的问题,它会指定函数的范围。考虑这两个函数
int dosomething(float x, float y, float z);
int Foo::dosomething(float x, float y, float z);
第一个是自由函数,后者是Foo
类的方法,并且(因为它前面没有单词static
)需要Foo
的实例从。来打电话。
答案 1 :(得分:1)
一般情况下,对现有的类范围使用::
范围运算符来引用自己的成员(即使它是多余的)也不是非法。
在声明类成员之后,可以在其成员范围内查找成员名称 类。 [注意:即使该类是一个不完整的类,也是如此。例如,
struct X {
enum E { z = 16 };
int b[X::z];
//确定
};
C ++11§3.3.2¶5
问题是声明点的定义似乎排除了在成员声明中使用范围运算符(如果它是自己的名称)。
名称的声明紧接在其完整声明者(第8条)之后和初始化程序之前(如果有),除非如下所述。 [示例:
int x = 12;
{ int x = x; }
这里第二个x
用自己的(不确定的)值初始化。 - 结束示例]
C ++11§3.3.2¶1
在§3.3.2的其余部分后面的段落中没有类成员的例外。
即使有上述限制,类成员的语法也不禁止使用 qualified-id 作为成员名称。因此,接受显示的代码不是语法错误。但是,存在语义违规,应该发出诊断信息。