gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:46:30 30 4
gpt4 key购买 nike

我有一个关于 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 完成的。它们都编译成功,但只有第一个有效。编译第二个片段时出现警告:warning C4551: function call missing argument list

为什么我们仍然必须放在方括号中才能正常工作,即使代码在没有它们的情况下也能成功编译,而且函数不接受任何参数?

最佳答案

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++。

关于c++ - 调用不带参数的 C++ 函数时括号的重要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23519692/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com