为什么调用成员函数就好像它是静态的(当它不是静态时)在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;
}
CCD_ 1调用CCD_ 2就像调用静态成员函数一样。但是,Test::printNum()
访问实例属性,并且显然不是静态的。然而,代码编译并运行以输出10
。
我的编译器是Apple LLVM 7.0.0版(clang-700.1.76)
我错过了什么?
我错过了什么?
你错了:
Test::weird()
调用Test::printNum()
作为类(静态)方法。
它不是作为static
方法调用的。不可能,因为它不是一个。
在成员函数中,您不需要对象引用或指针(例如this
)来调用另一个成员函数。所以你可以写以下任意一个:
this->printNum();
printNum();
printNum
的全名实际上是Test::weird()
0,所以你也可以这样做:
this->Test::printNum();
Test::printNum();
在成员函数之外,这两种情况下的第二个选项都是错误的,因为该函数不是静态的,并且您没有提供对象引用或指针。
在成员函数之外,您还需要编写Test::
,否则编译器将不知道您所说的是哪个printNum
,但这本身并不会强制调用为"静态"调用。如果成员函数是静态的,那么它将是一个静态调用;时期
您可以使用printNum();而不是这个->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(); } }
所以测试::printNum();只是对方法printNum()的调用;这一类的。
相关文章:
- C++实用程序::转换在静态链接库中不起作用
- 针对静态库的 G++ 链接不起作用
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 强制链接静态库与 cmake 不起作用
- 静态使用 make_unique 和 make_shared不起作用
- 当应用于静态方法时,为什么constexpr属性不起作用
- CMake:使静态库有效,但动态库不起作用
- 在声明节点创建链接列表时,为什么静态内存分配不起作用
- Boost Logger静态链接:不起作用
- 静态控制滚动条不起作用 Win32
- 称为 C 静态库,所有内容都包装在外部"C"中,但它仍然不起作用
- 通过JNI调用简单的java静态方法是不起作用的,尽管c++编译并运行它
- 静态函数调用不起作用 (C++)
- 如果我在静态成员中使用,Qt tr() 不起作用
- 定位在静态控制中不起作用
- 为什么其中一个模板静态函数有效,而另一个不起作用
- 为什么静态流不起作用
- 为什么调用成员函数就好像它是静态的(当它不是静态时)在C++中起作用?
- OpenCV和Visual Studio 2015:为什么包含静态库不起作用
- 静态私有变量在c++中不起作用