我对C ++中没有参数的函数有疑问,也可能是C。
我正在写一个简单的程序,它有一个类。该类有一定的静态方法。这就是头文件的样子:
class SampleClass {
public:
SampleClass();
~SampleClass();
static void CertainMethod();
}
CertainMethod()不带参数,是静态的,应打印出“SAMPLETEXT”。我的问题是,为什么我们在调用它时仍然需要括号?这里有两段main():
int main(int argc, const char** argv) {
SampleClass::CertainMethod();
system("pause");
return 0;
}
和
int main(int argc, const char** argv) {
SampleClass::CertainMethod;
system("pause");
return 0;
}
两个片段的目的是打印出“SAMPLETEXT”,这是由CertainMethod完成的。它们都成功编译,但只有第一个有效。编译第二个片段时会出现警告:警告C4551:函数调用缺少参数列表。
为什么我们仍然必须放入括号以使其工作,即使代码在没有它们的情况下成功编译,并且该函数不接受任何参数?
答案 0 :(得分:3)
SampleClass::CertainMethod
是函数的名称。
函数的名称在许多使用上下文中隐式地衰减为指向函数的指针。
假设你有:
void foo( void(*)() )
是一个函数foo
,它接受一个函数指针。然后
foo( SampleClass::CertainMethod )
会将指向SampleClass::CertainMethod
的指针传递给foo
,以便与它做什么。
SampleClass::CertainMethod
无法调用该函数,因为那时你无法谈论它的指针!
在您的情况下,您正在命名该功能,然后将其丢弃。您可以在C ++中执行此操作 - 您可以使用以下语句:
int a = 3, b = 5;
a+b;
a+b
将a
添加到b
,然后丢弃结果。表达是法律声明。
这也是合法的:
a;
这是一个简单的表达式,其值为3
,但对值没有任何作用。
因此,您的行是一个表达式,用于评估指向SampleClass::CertainMethod
的指针或引用。值得警告,但仍然是合法的C ++。