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

时间:2015-12-27 22:23:49

标签: c++ static-methods

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

Test::weird()

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

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

我错过了什么?

2 个答案:

答案 0 :(得分:19)

  

我错过了什么?

你错了:

  

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

它没有被称为static方法。它不可能,因为它不是一个。

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

this->printNum();
printNum();

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

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

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

在会员功能之外,您还 来编写Test::,否则编译器将无法知道您printNum哪个ConcurrentHashMap谈论,但这本身并没有强迫这个呼叫是一个静态的"呼叫。如果成员函数是静态的,它将是一个静态调用;期!

答案 1 :(得分:8)

你可以使用printNum();而不是this-> 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(); } }

所以Test :: printNum();只是调用方法printNum();这个班。