3

我不确定是否

return *this

是我们可以返回调用成员函数的类的实例的唯一方法吗?我问的原因是因为我们的教练告诉我们在必要时避免使用指针,我想知道这是不是唯一必要的方法是返回 this 指针。

我正在使用一个包含私有数据成员分子和分母的分数类。我正在谈论的成员函数用于添加两个分数,例如:

Fraction C = A.plus(B);

plus 成员函数定义如下:

Fraction& plus( const Fraction frac )

教练希望我们做 C = A += B ,所以我想这就是原因。

4

7 回答 7

7

找一个新导师。看起来好像 plus() 的声明是完全错误的。

  • 它可能应该返回一个值而不是一个引用
  • 如果它必须返回一个引用,它应该返回一个 const 引用
  • 它绝对应该将 const 引用作为参数

这适用于成员 plus() 函数的可能合理实现。当然,应该是朋友吧。

于 2009-06-25T00:40:56.283 回答
2

我认为在这种情况下使用是安全的

return *this

因为this引用当前对象所以保证存在,所以不会为空。

返回对自身的引用的原因plus是它可以被链接:

Fraction C = A.plus(B).plus(D) // perhaps?

请注意,在上述情况下,将通过复制加法结果来创建 C。这也假设操作plus是为了修改对象(在本例中为 A)并返回对该修改对象的引用。

不会加上接受引用而不是复制参数吗?

Fraction& plus( const Fraction& frac )

这类似于您将如何实现operator=(示例):

  A& operator=(const A& right) {
    if(this == &right) return *this;    // Handle self-assignment
    b = right.b;
    return *this;
  }

也许您不想修改对象并返回新对象:

// assuming there's a constructor Fraction(int numerator, int denominator):
Fraction* plus(Fraction const& rhs)
{
    return new Fraction(numerator * rhs.denominator
                        + rhs.numerator * denominator,
                        denominator * rhs.denominator);
}

但这当然必须返回指向新实例的指针,这不是您的任务中可能需要的引用(?)。

甚至更好:

Fraction plus(Fraction const& rhs)
{
    return Fraction(numerator * rhs.denominator
                    + rhs.numerator * denominator,
                    denominator * rhs.denominator);
}

这将在调用函数的空间中创建 Fraction,因此没有在返回时复制结构的开销。

于 2009-06-25T00:38:14.310 回答
1

是的,这是唯一的方法。在方法中访问当前对象的唯一方法是通过 this,它是一个指针。

这很好,并且是公认的做法。

于 2009-06-25T00:36:19.507 回答
1

回国也没什么不好*this。例如,这就是修改运算符的重载应该如何工作。看起来 plus 方法实际上只是为您的类提供 operator+= 的一种方式,而实际上并未重载运算符(我假设您还没有进行运算符重载),因此*this在这种情况下返回是通常的行为。

于 2009-06-25T00:36:19.960 回答
0

在您的plus()方法中,您可能应该创建一个新Fraction对象并返回它,而不是修改当前对象然后返回*this. 你可能不想改变AA.plus(B)要返回一个新Fraction的,签名plus()最好是:

Fraction plus(const Fraction &frac);

(如果您当前没有thisplus()方法中进行修改,为什么要返回*this?)

于 2009-06-25T00:37:44.763 回答
0

我相信语义应该是成员函数'plus'返回一个'new'对象,它代表调用者和被调用者的总和。注意 :: new 并不意味着 C++ 中的 'new' 关键字 :) 所以对于你的例子,

// the constructor accepts (numerator, denominator).
// in your case, the caller object would be A, and the called object would be B(other).
return Fraction(numerator * other.denominator + other.numerator * denominator, denominator * other.denominator);

我认为返回对 this 的引用是正确的唯一地方是当您重载具有副作用的运算符时。

为了澄清更多,这应该是你的“加号”签名,

Fraction plus( const Fraction& frac );

呼叫者和被呼叫者都不受“加号”的影响。

于 2009-06-25T00:38:53.403 回答
0

我们的教练告诉我们在必要时避免使用指针

您实际上返回的是取消引用指针的值,而不是指针。所以你应该很好。

就个人而言,我从不明确调用方法或通过this. 也就是说,我不做以下事情:

class A {
    public:
    int x;
    int get_x()
    {
        return this->x;
    }

    int get_x_plus_5()
    {
        return this->get_x() + 5;
    }
}

但是,我完全可以返回*this

您的讲师可能试图让您避免(1)从函数返回指向堆栈上对象的指针(这意味着它们在函数退出后将不存在)和(2)当您不时在免费存储中分配对象'不必。 this不受这些问题的困扰。

于 2009-06-25T00:52:07.387 回答