wsa*_*eem 7 c++ static-methods
根据我对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;
}
Run Code Online (Sandbox Code Playgroud)
Test::weird()调用,Test::printNum()因为它将是一个静态成员函数.但是,Test::printNum()访问实例属性并且显然不是静态的.然而,代码编译并运行到输出10.
我的编译器是Apple LLVM版本7.0.0(clang-700.1.76)
我错过了什么?
Lig*_*ica 19
我错过了什么?
你这是错的:
Test::weird()调用Test::printNum()作为类(静态)方法.
它不被称为static方法.它不可能,因为它不是一个.
在成员函数中,您不需要对象引用或指针(例如this)来调用另一个成员函数.所以你可以写下这两个:
this->printNum();
printNum();
Run Code Online (Sandbox Code Playgroud)
printNum实际上是全名Test::printNum,所以你也可以这样做:
this->Test::printNum();
Test::printNum();
Run Code Online (Sandbox Code Playgroud)
在成员函数之外,两种情况下的第二个选项都是错误的,因为该函数不是静态的,并且您没有提供对象引用或指针.
在成员函数之外,你还必须编写,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(); } }
Run Code Online (Sandbox Code Playgroud)
所以Test :: printNum(); 只是调用方法printNum(); 这堂课.