在C++中返回"this"?

nob*_*ody 15 c++ return this

在Java中,您只需return this获取当前对象即可.你是如何用C++做到的?

Java的:

class MyClass {

    MyClass example() {
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*obᵩ 35

好吧,首先,你不能从void退回功能返回任何东西.

有三种方法可以返回提供对当前对象的访问权限:通过指针,引用和值.

class myclass {
public:
   // Return by pointer needs const and non-const versions
         myclass* ReturnPointerToCurrentObject()       { return this; }
   const myclass* ReturnPointerToCurrentObject() const { return this; }

   // Return by reference needs const and non-const versions
         myclass& ReturnReferenceToCurrentObject()       { return *this; }
   const myclass& ReturnReferenceToCurrentObject() const { return *this; }

   // Return by value only needs one version.
   myclass ReturnCopyOfCurrentObject() const { return *this; }
};
Run Code Online (Sandbox Code Playgroud)

如上所述,三种方式中的每一种都以略微不同的形式返回当前对象.您使用哪一个取决于您需要哪种形式.

  • 不要忘记const版本. (3认同)
  • 嗨,我在哪里可以读到`需要const而不是const版本`.我无法理解这一点.如果方法改变不是类成员,我写const版本,否则 - 写不是const.为什么我需要两个人? (3认同)

小智 8

在类中通过引用返回的主要优点之一是能够轻松链接函数.

假设您的成员函数是乘以您班级的特定成员.如果你使头文件和源文件分别保存类的信息和成员函数的定义,那么头文件 myclass.h将是:

#ifndef myclass_h
#define myclass_h
class myclass{
  public:
    int member1_;
    double member2_;

    myclass (){
       member1_ = 1;
       member2_ = 2.0;
    }     

    myclass& MULT(int scalar);
    myclass* MULTP(double scalar);
};
#endif 
Run Code Online (Sandbox Code Playgroud)

和源文件:myclass.cpp将是:

myclass& myclass::MULT(int scalar){
      member1_ *= scalar;
      return *this; 
}
myclass* myclass::MULTP(double scalar){
      member2_ *= scalar;
      return this; 
}
Run Code Online (Sandbox Code Playgroud)

如果初始化一个被调用的对象obj,则上面的默认构造函数设置member1_为1:然后在main函数中,您可以执行以下链:

myclass obj;
obj.MULT(2).MULT(4);
Run Code Online (Sandbox Code Playgroud)

那么member1_现在将是8.当然,这个想法可能是连接不同的功能,并改变不同的成员.

在使用return by pointer的情况下,第一个调用使用该对象,任何后续调用都会将前一个结果视为指针,因此

obj.MULTP(2.0)->MULTP(3.0);
Run Code Online (Sandbox Code Playgroud)