当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么调用成员函数就好像它是静态的(当它不是)在C++中工作?》经验,为你挑选了2个好方法。

根据我对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`成员函数或解释为什么相反它不是.
这不是答案.
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有