2009-06-25 223 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不會遇到這些問題。

相關問題