以下4种样式调用其他成员方法有什么区别?

What's the difference between following 4 styles call other member method?

本文关键字:什么 区别 成员方法 其他 4种 样式 调用 以下      更新时间:2023-10-16

以下 4 种调用另一个成员函数的样式有什么区别?

是否有任何好处导致一种方法是可取的?

void Object::trigger() {
  (*this).triggerinner(10);
  this->triggerinner(10);
  triggerinner(10);
  Object::triggerinner(10);
}
void Object::triggerinner(int x) {
  std::cout << "trigger" << std::endl;
}

前三个在非模板代码中基本相同。在模板成员函数中,前两个使名称查找依赖(因此编译器可以在依赖关系中找到名称基类)。 一般来说,越简单越好,所以大多数人都喜欢第三种形式,除非需要依赖查找,在这种情况下,他们将使用第二个。

第四种形式阻止虚拟分辨率。 (它有,在事实上,与上述三种形式相同,即 this->Object::triggerinner(10)等) 当你使用它时想要强制分辨率:调用的函数将在 ObjectObject 的基类中,但从不派生类,即使函数是虚拟的。 这是最常用的在派生类中,在之前调用基类实现(或之后)做额外的工作:

void
Derived::func()
{
    Base::func();
    //  Additional work here...
}

在成员函数之外,它还可用于调用没有对象时的静态成员函数。

前两者完全等价。根据定义,(*p).thingp->thing 对于任何指针都是等效的。

在这种情况下,第三个是等效的;但如果成员函数的名称被本地声明隐藏,则可能具有不同的含义。在某些情况下(函数是基类的成员,并且涉及模板),当此窗体找不到该函数时,在这种情况下,您必须使用其他窗体之一。

如果函数不是虚拟的,则第四个是等效的。如果它是虚拟的,那么这将强制对此类中可用的覆盖进行非虚拟调用,而不是最终覆盖。

(*this).triggerinner(10);

这很丑陋,"->"是为了避免这样做。

this->triggerinner(10);

这很好,但this->不是强制性的。如果您正在处理现有项目,请保留当前的编码样式。

triggerinner(10);

很好,与使用this->的解决方案相同的评论.

Object::triggerinner(10);

将其用于静态方法。

我建议您使用triggerinner(10)因为它简短明了。

最常用的

是this->triggerinner(10);。它使用指针与表轻松匹配的原因。

this->triggerinner(10)比其他

的更好:

  1. (*this).triggerinner(10)更好,因为它更具可读性。
  2. triggerinner(10)更好,因为在这种情况下,您将不知道triggerinner()是一个方法还是一个函数(然后具有不同的范围)。
  3. 优于主要用于静态方法的Object::triggerinner(10)(但不仅如此)

没有区别,除非你的编译器做了一些时髦的事情。尝试阅读函数中的行生成的汇编语言,看看是否有任何差异,或者它是否是一遍又一遍生成的同一指令块。

至于"最好"或"最受欢迎"的,这取决于您的个人喜好,或者在公司工作时,他们可能会强制执行某些编码标准,迫使您在每次做某事时都以特定的方式编写。