当前位置:   iOS > 正文

为什么调用成员函数就好像它是静态的(当它不是)在C++中工作?

c++,static-methods,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站长工具

根据我对C++的理解,下面的代码是错误的.

#include 

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)

我错过了什么?



1> Lightness Ra..:

我错过了什么?

你这是错的:

Test::weird()调用Test::printNum()作为类(静态)方法.

它不被称为static方法.它不可能,因为它不是一个.

在成员函数中,您不需要对象引用或指针(例如this)来调用另一个成员函数.所以你可以写下这两个:

this->printNum();
printNum();

printNum实际上是全名Test::printNum,所以你也可以这样做:

this->Test::printNum();
Test::printNum();

在成员函数之外,两种情况下的第二个选项都是错误的,因为该函数不是静态的,并且您没有提供对象引用或指针.

在成员函数之外,你还必须编写,Test::否则编译器不会知道printNum你在说什么,但这本身并不强制调用是一个"静态"调用.如果成员函数是静态的,它将是一个静态调用; 期!



2> 小智..:

你可以使用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(); 这堂课.


一切都是真的,但却具有误导性.除了可以方便地调用基本成员这一事实之外,限定函数名称的能力与继承没什么关系,即使它确实如此,这也无法解释为什么OP认为它保留用于调用`static`成员函数或解释为什么相反它不是.
这不是答案.
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/iOS/detail/8671
推荐阅读
相关标签
  

闽ICP备14008679号