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

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

根据我对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;
}

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

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

我错过了什么?

您可以使用 printNum();而不是 this->printNum(); .

继承classes时,使用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(); } }

所以Test::printNum();只是对方法 printNum() 的调用; class.

What am I missing?

你错了:

Test::weird() calls Test::printNum() as a class (static) method.

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

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

this->printNum();
printNum();

printNum的全称其实是Test::printNum,所以你也可以这样做:

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

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

在成员函数之外你还来写Test::否则编译器不知道你在说哪个printNum关于,但这本身并不强制调用为 "static" 调用。如果成员函数是静态的,它将是一个静态调用;期间!