C++中func()和(*this).func()之间的区别

gta*_*atr 59 c++ dispatch

我正在使用C++编写其他代码,我发现了对某个函数的奇怪调用func().这是一个例子:

if(condition)
    func();
else
    (*this).func();
Run Code Online (Sandbox Code Playgroud)

func()和之间有什么区别(*this).func()

调用func()(*this).func()执行不同代码的情况是什么?

在我的情况下,func()不是宏.它是基类中的虚函数,在基类和派生类中都有实现,并且没有空闲func().在if位于在基类的方法.

lis*_*rus 47

实际上存在差异,但在非常重要的背景下.考虑以下代码:

void func ( )
{
    std::cout << "Free function" << std::endl;
}

template <typename Derived>
struct test : Derived
{
    void f ( )
    {
        func(); // 1
        this->func(); // 2
    }
};

struct derived
{
    void func ( )
    {
        std::cout << "Method" << std::endl;
    }
};

test<derived> t;
Run Code Online (Sandbox Code Playgroud)

现在,如果我们调用t.f(),第一行将test::f调用自由函数func,而第二行将调用derived::func.

  • @ g.tataranni而且,如果您的问题中没有上下文,我们应该怎么知道呢?请向我们提供[mcve],以便不涉及猜测. (40认同)
  • 这让我想起:知道泄漏计划为何会获得相当大的电话费?没有'免费'电话. (25认同)
  • 我相信这是一个关于免费功能的笑话 (11认同)
  • 我同意你的看法.但就我而言,没有免费的功能;) (2认同)

Gal*_*lik 31

从代码片段中无法分辨,但可能有两个 可调用的对象被调用func().在(*this).func();确保成员函数被调用.

可调用对象可以是(例如)一个functor或一个lambda表达式:

函子

struct func_type
{
    void operator()() const { /* do stuff */ }
};

func_type func; // called using func();
Run Code Online (Sandbox Code Playgroud)

拉姆达

auto func = [](){ /* do stuff */ }; // called using func();
Run Code Online (Sandbox Code Playgroud)

例如:

#include <iostream>

class A
{
public:

    // member 
    void func() { std::cout << "member function" << '\n'; }

    void other()
    {
        // lambda
        auto func = [](){ std::cout << "lambda function" << '\n'; };

        func(); // calls lambda

        (*this).func(); // calls member
    }
};

int main()
{
    A a;
    a.other();
}
Run Code Online (Sandbox Code Playgroud)

输出:

lambda function
member function
Run Code Online (Sandbox Code Playgroud)


Rev*_*lot 17

另外一种情况是这两行将调用不同的函数:

#include <iostream>

namespace B
{ void foo() { std::cout << "namespace\n"; } }

struct A { 
  void foo() { std::cout << "member\n"; }

  void bar()
  {
      using B::foo;
      foo();
      (*this).foo();
  }
};

int main () 
{
    A a;
    a.bar();
}
Run Code Online (Sandbox Code Playgroud)


Jar*_*d42 12

使用类型相关的名称,它可能是不同的:

void func() { std::cout << "::func()\n"; }

struct S {
    void func() const { std::cout << "S::func()\n"; }
};

template <typename T>
struct C : T
{
    void foo() const {
        func();         // Call ::func
        (*this).func(); // Call S::func
    }
};
Run Code Online (Sandbox Code Playgroud)

演示