2009-06-25 90 views
3

我不知道如果正在使用*这是一个好主意吗?

return *this 

是我们可以返回一个类叫谁的成员函数的一个实例的唯一途径?我问的原因是因为我们的教师告诉我们必要时避免使用指针,我想知道是否这种情况下唯一必要的方法是返回这个指针。

我正在处理一个持有私人数据成员分子和分母的分数类。我说的成员函数用来添加两个部分,例如:

Fraction C = A.plus(B); 

加上成员函数的定义是这样的:

Fraction& plus(const Fraction frac) 

指导员要我们做C = A + = B,所以我想这就是为什么。

+13

找一位新教练。 – 2009-06-25 00:36:42

+1

是否应该在你的例子中修改A?如果不是,你应该返回一个新的Fraction对象,它是A和B的总和。 – 2009-06-25 00:39:20

回答

7

找一位新教练。看起来好像plus()的声明是完全错误的。

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

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

1

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

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

1

返回*this没有任何问题。例如,这就是修改操作符的重载应该如何工作的原因。看起来加号方法实际上只是为你的类提供operator + =的一种方式,而实际上并没有重载运算符(我假设你还没有得到运算符超载),所以在这种情况下返回*this是通常的行为。

0

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

Fraction plus(const Fraction &frac); 

(在您目前没有在plus()方法修改this情况下,为什么要返回*this?)

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); 
} 

这将调用函数的空间中创建分数所以有复制结构对回报的开销。

+0

实际上,这不能保证是非空的。在取消引用时,在NULL对象上调用方法会导致崩溃。 – Michael 2009-06-25 00:43:43

0

我认为这个语义应该是成员函数'plus'返回一个代表调用者和被调用者总和的'new'对象。 注::新并不意味着“新”在C++中的关键字:) 所以对于你的榜样,

// 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); 

我看到它正确返回此引用的唯一的地方是当你超载有侧运营商效果。

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

Fraction plus(const Fraction& frac); 

无论是主叫还是被叫应该由“加”来实现。

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不会遇到这些问题。

相关问题