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

时间:2016-08-04 10:09:48

标签: c++ dispatch

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

if(condition)
    func();
else
    (*this).func();

func()(*this).func()之间的区别是什么?

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

就我而言,func()不是宏。它是基类中的虚函数,在基类和派生类中都有实现,没有空闲func()if位于基类的方法中。

4 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:31)

无法从代码段中分辨出来,但可能会有名为func()两个 可调用对象(*this).func();确保调用成员函数。

可调用对象可以是(例如)functorlambda表达式:

<强>算符

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

func_type func; // called using func();

<强>拉姆达

auto func = [](){ /* do stuff */ }; // called using func();

例如:

#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();
}

<强>输出:

lambda function
member function

答案 2 :(得分: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();
}

答案 3 :(得分: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
    }
};

Demo