为什么调用成员函数就好像它是静态的(当它不是)在 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" 调用。如果成员函数是静态的,它将是一个静态调用;期间!
根据我对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()
callsTest::printNum()
as a class (static) method.
它不是作为 static
方法调用的。不可能,因为它不是一个
在成员函数中,您不需要对象引用或指针(例如this
)来调用另一个成员函数。所以你可以这样写:
this->printNum();
printNum();
printNum
的全称其实是Test::printNum
,所以你也可以这样做:
this->Test::printNum();
Test::printNum();
在成员函数之外,两种情况下的第二个选项都是错误的,因为该函数不是静态的并且您没有提供对象引用或指针。
在成员函数之外你还有来写Test::
否则编译器不知道你在说哪个printNum
关于,但这本身并不强制调用为 "static" 调用。如果成员函数是静态的,它将是一个静态调用;期间!