1

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

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

void foo(A &a)
{

}

谢谢你

4

4 回答 4

6

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


笔记

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

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

  • 如果声明了成员函数,则const仅允许使用取消引用的指针调用采用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&) */
}
于 2013-07-15T10:45:27.890 回答
4

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

class B;

void foo(B&);
void bar(B const&);

class B {
  void meow() const {
    bar(*this); //OK
    foo(*this); //ERROR
  }
};
于 2013-07-15T10:46:03.450 回答
1

这非常好,并且是“我希望其他一些函数或对象了解此对象”的常见模式。

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

于 2013-07-15T10:47:14.093 回答
1

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

于 2013-07-15T10:46:03.503 回答