调用不带参数的C ++函数时的括号重要性

时间:2014-05-07 13:49:27

标签: c++ functional-programming brackets

我对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:函数调用缺少参数列表

为什么我们仍然必须放入括号以使其工作,即使代码在没有它们的情况下成功编译,并且该函数不接受任何参数?

1 个答案:

答案 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+ba添加到b,然后丢弃结果。表达是法律声明。

这也是合法的:

a;

这是一个简单的表达式,其值为3,但对值没有任何作用。

因此,您的行是一个表达式,用于评估指向SampleClass::CertainMethod的指针或引用。值得警告,但仍然是合法的C ++。