根据我对C ++的理解,以下代码是错误的。
Test::weird()
Test::printNum()
调用Test::printNum()
,就像静态成员函数一样。但是,10
访问实例属性,显然不是静态的。然而,代码编译并运行以输出{{1}}。
我的编译器是Apple LLVM版本7.0.0(clang-700.1.76)
我错过了什么?
答案 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();这个班。