为什么调用成员函数就好像它是静态的(当它不是静态时)在C++中起作用?

Why does calling a member function as if it were static (when it's not) work in C++?

本文关键字:静态 起作用 C++ 函数 成员 调用 为什么      更新时间:2023-10-16

根据我对C++的理解,以下代码是错误的。

#include <iostream>
class Test {
private:
  int num_;
public:
  Test(int n) : num_(n) {}
  void printNum() { std::cout << num_ << 'n'; }
  void weird() { Test::printNum(); }
};
int main() {
  Test t(10);
  t.weird();
  return 0;
}

CCD_ 1调用CCD_ 2就像调用静态成员函数一样。但是,Test::printNum()访问实例属性,并且显然不是静态的。然而,代码编译并运行以输出10

我的编译器是Apple LLVM 7.0.0版(clang-700.1.76)

我错过了什么?

我错过了什么?

你错了:

Test::weird()调用Test::printNum()作为类(静态)方法。

它不是作为static方法调用的。不可能,因为它不是一个。

在成员函数中,您不需要对象引用或指针(例如this)来调用另一个成员函数。所以你可以写以下任意一个:

this->printNum();
printNum();

printNum的全名实际上是Test::weird()0,所以你也可以这样做:

this->Test::printNum();
Test::printNum();

在成员函数之外,这两种情况下的第二个选项都是错误的,因为该函数不是静态的,并且您没有提供对象引用或指针。

在成员函数之外,您还需要编写Test::,否则编译器将不知道您所说的是哪个printNum,但这本身并不会强制调用为"静态"调用。如果成员函数是静态的,那么它将是一个静态调用;时期

您可以使用printNum();而不是这个->printNum()。

继承类时,使用NameOfClass::printNum();使用printNum();你想要的。

示例:

class A { public: void test() { std::cout << "hey" << std:endl; } }
class B : public A { public: void test() { std::cout << "oh" << std:endl; } }
class C : public B { public: void test() { A::test(); } }

所以测试::printNum();只是对方法printNum()的调用;这一类的。