是否允许将 *this 作为接受引用(&)的函数的参数传递?

is it allowed to pass *this as an argument of a function accepting a reference(&)?

本文关键字:引用 参数传递 函数 this 是否      更新时间:2023-10-16

我一直在使用这个方法,没有任何问题,但我想确定这是一个完全允许的方法,还是我只是运气好!

class A
{
public:
    void bar()
    {
        foo(*this);
    }
};
void foo(A &a)
{
}

感谢

只要void Foo(A&)(正向)声明A::bar就知道它的存在,它是完全有效的,并且是100%允许的。


票据

  • 有什么地方我不能取消引用this吗?

    不是,但是有一些问题你应该知道。如果您想在构造对象的初始化列表中使用*this,请记住不允许通过它访问该对象的虚拟未初始化成员;既不直接也不间接。

  • 如果成员函数被声明为const,则只允许使用取消引用的this指针调用具有常量(引用)的函数,请参阅以下示例。

void func (struct Obj&);
void func (struct Obj const&);
struct Obj {
  void bar () const {
    func (*this);
  }
  void bar () {
    func (*this);
  }
};

int
main (int argc, char *argv[])
{
  Obj       a;  
  Obj const b;
  a.bar (); /* func (Obj &) */
  b.bar (); /* func (Obj const&) */
}

是的,这是允许的。请注意,从const方法中,只能将*this传递给接受const参数的函数:

class B;
void foo(B&);
void bar(B const&);
class B {
  void meow() const {
    bar(*this); //OK
    foo(*this); //ERROR
  }
};

是的,这是完全合法的。这就是在某些运算符(如赋值运算符)中编写return *this;时所做的操作。

这非常好,也是"我想让其他函数或对象了解这个对象"的常见模式。

只需确保引用的保存时间不会超过传入引用的生存期即可。