func()和(* this).func()在C ++中的区别
我正在使用C ++编写别人代码,并且发现了一个奇怪的调用函数func()
。 这里是一个例子:
if(condition) func(); else (*this).func();
func()
和(*this).func()
之间有什么区别?
什么情况下调用func()
和(*this).func()
将执行不同的代码?
在我的情况下, func()
不是一个macros。 它是基类中的一个虚函数,在基类和派生类中都有一个实现,没有自由的func()
。 if
位于基类中的一个方法中。
实际上有一个区别,但在一个非常平凡的背景下。 考虑这个代码:
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;
现在,如果我们调用tf()
, test::f
的第一行将调用自由函数func
,而第二行将调用derived::func
。
从片段中不可能看出来,但是可能有两个 可调用的对象叫做func()
。 (*this).func();
确保调用成员函数。
可调用的对象可以是(例如)一个functor
或lambda
expression式:
函子
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
另一种情况下,这两行将调用不同的function:
#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(); }
与types相关的名称,可能会有所不同:
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 } };
演示