根据我对C++的理解,下面的代码是错误的.
#includeclass 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)
我错过了什么?
我错过了什么?
你这是错的:
Test::weird()
调用Test::printNum()
作为类(静态)方法.
它不被称为static
方法.它不可能,因为它不是一个.
在成员函数中,您不需要对象引用或指针(例如this
)来调用另一个成员函数.所以你可以写下这两个:
this->printNum(); printNum();
printNum
实际上是全名Test::printNum
,所以你也可以这样做:
this->Test::printNum(); Test::printNum();
在成员函数之外,两种情况下的第二个选项都是错误的,因为该函数不是静态的,并且您没有提供对象引用或指针.
在成员函数之外,你还必须编写,Test::
否则编译器不会知道printNum
你在说什么,但这本身并不强制调用是一个"静态"调用.如果成员函数是静态的,它将是一个静态调用; 期!
你可以使用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(); 这堂课.