2011-12-11 26 views
0

如何以這種方式修改以下代碼,我不需要在主函數中重複f2=11; f3=12;。該代碼用於重載最常用的操作符。重載運算符以處理類對象?

class FLOAT{ 
    private: 
     float x; 
    public: 
     FLOAT(){ x=0.0; } 
     void setFloat(float f)  { x=f; } 
     float getFloat()   { return x;}; 
     FLOAT operator+(FLOAT obj) {x=x+obj.x; return *this;}; 
     FLOAT operator-(FLOAT obj) {x=x-obj.x; return *this;}; 
     FLOAT operator*(FLOAT obj) {x=x*obj.x; return *this;}; 
     FLOAT operator/(FLOAT obj) {x=x/obj.x; return *this;}; 
     FLOAT& operator=(const FLOAT& obj) {this->x=obj.x; return *this; }; 
     FLOAT& operator=(const float& y) {this->x=y; return *this; }; 
}; 

int main() { 
    FLOAT f,f2,f3; 
    f2=11; 
    f3=12; 

    f=f3-f2; 
    cout<<"f3-f2 ="<<f.getFloat()<<endl; 


    f2=11; 
    f3=12; 
    f=f3+f2; 
    cout<<"f3+f2 ="<<f.getFloat()<<endl; 

    f2=11; 
    f3=12; 
    f=f3*f2; 
    cout<<"f3*f2 ="<<f.getFloat()<<endl; 

    f2=11; 
    f3=12; 
    f=f3/f2; 
    cout<<"f3/f2 ="<<f.getFloat()<<endl; 

    system("pause"); // to pause console screen 
    return 0; 
} 
+2

推薦閱讀:http://stackoverflow.com/questions/4421706/operator-overloading –

+1

簡短的總結是你編寫的操作符幾乎像+ =, - =,* =和/ =。爲了得到你想要的東西,你需要像+, - ,*和/那樣的操作符。 – Hurkyl

+0

縮進。 **請。** –

回答

3

@ Oli的回答幾乎告訴你什麼最小你需要做的事情,使您的代碼工作。然而,我看到(我甚至知道@Oli看到)你的課程實施有許多缺陷。

由於您已實施FLOAT,我向您解釋執行DoubleFLOAT的實施方式會類似)。

class Double { 
    double data; 
public: 
    Double (double p=0.0) : data(p){} 
    double value() { return data; } 
    Double & operator+=(Double const & other) 
    { 
     data += other.data; 
     return *this; 
    } 
    Double & operator-=(Double const & other) 
    { 
     data -= other.data; 
     return *this; 
    } 
    //... 
}; 

請注意,您不需要執行operator=(Double const&)Double(Double const&)。編譯器生成的就足夠了。由於構造函數帶有一個類型爲double的參數,因此您也不需要實現operator=(double const &)。編譯器生成的複製語義以及構造函數將會處理這個問題。

現在看到這一點,

//implement operator+ and operator- as non-member functions 
Double operator+(Double a, Double const & b) 
{ 
    a += b; //a is local copy, so we can change it 
    return a; 
} 
Double operator-(Double a, Double const & b) 
{ 
    a -= b; //a is local copy, so we can change it 
    return a; 
} 

請注意,我在operator+=operator-=方面分別實現operator+operator-

同樣,您可以實現operator/=operator*=作爲成員函數,然後根據它們實現operator/operator*

2

您的操作員應該創建一個新的實例;他們不應該自己修改(事實上,他們應該被宣佈爲const以防止這種情況)。

例如爲:

FLOAT operator+(FLOAT obj) const 
{ 
    FLOAT tmp; 
    tmp.setFloat(x + obj.x); 
    return tmp; 
} 

注有更地道的定義運算符重載(例如在operator+=來定義operator+,並定義一個構造函數一個float)的方式。但上述應該足夠了。

+0

添加一個'FLOAT(float a_x)'構造函數可以改善這一點:'FLOAT運算符+(FLOAT obj)const {return FLOAT(x + obj.x); }' – hmjd