2014-11-22 15 views
1

在C++中是否有覆蓋和左手操作符的可能性?重寫左手操作符的可能性?

例如,它很容易覆蓋的右手:舉個例子:

class MyClass{ 
    public inline MyClass operator*(float &other) 
    { 
    return MyClass(this->Data * other); 
    } 
}; 

所以我可以使用類似的東西:

MyClass a = MyClass(...) * 0.4f; 

做什麼,如果有人想這樣寫:

MyClass a = 0.4f* MyClass(); 

在C#中,這很容易完成,因爲存在類擴展。 C++是否也知道一些解決方法?

+4

是的,C++有免費的功能,我不會稱之爲解決方法。你的例子也是錯誤的。你不能將'0.4f'作爲'float'來傳遞。 – chris 2014-11-22 15:45:52

回答

1

你可以覺得像類成員函數:

ReturnType Function(TypeOfThisClass* this_, TypeOfParam param, ...) 

( 您在std::thread使用這種形式過於:(即把類PTR作爲參數)

class MyClass { void Function() { ; }; } 
.... 
MyClass myClass; 
std::thread(&MyClass::Function, &myClass); 

所以你的成員是:

class MyClass{ 
    .... 
    friend MyClass operator*(const MyClass& this_, float &other) 
    { 
    return MyClass(this_.Data * other); 
    }; 

    /*or MyClass operator*(float &other) 
    { 
    return MyClass(this->Data * other); 
    };, which is the same, except you use it with reference not pointer)*/ 

    friend MyClass operator*(float &other, const MyClass& this_) 
    { 
    return this_ * other; //you can use the overloaded op. since it is defined above (first arg is class) 
    }; 
}; 

,如果你想訪問你的類protectedprivate數據(這應該是在OOP的情況下),你應該只使用friend關鍵字。

+0

'friend'允許訪問私有數據以及受保護的數據。這裏慣用的習慣是定義一個公共'MyClass&MyClass :: operator * =(MyClass const&rhs);',然後使用它定義全局'operator *'。 – 2014-11-22 16:54:42

+0

@詹姆斯Kanze我的意思是不公開可見與「保護」,編輯。還有你說的這個成語是什麼,也許我可以把它添加到答案中。我只是寫下了編譯器如何「看見」函數,以便更好地理解發生了什麼。 – 2014-11-22 18:55:42

+0

我在說的這個習語是,如果你支持a op b,你也應該支持a op= b。後者通常應該是一個成員(因爲你不想在左側進行轉換),而前者很容易實現後者,所以甚至不需要成爲朋友。 – 2014-11-24 10:13:41

2
MyClass a = 0.4f* MyClass(); 
MyClass a = MyClass(...) * 0.4f; 

對於這些有意義的聲明operator *作爲類的非成員函數以及單參數構造函數。

2

是的,你可以聲明運算符重載爲自由函數。在你的情況,因爲這兩種操作排序具有相同的含義,你可以委託一至其它:

class MyClass 
{ 
    float data_; 

public: 
    explicit MyClass(float data) : data_(data) { } // exposition only 

    MyClass operator*(float val) const { return MyClass(data_ * val); } 
}; 

MyClass operator*(float val, MyClass const & x) { return x * val; } 

現在,當你有MyClass x;和你說x * 4,這使用成員超載,但是當你說4 * x,它使用自由函數,而函數又調用成員函數。

請注意,通過委託給相反的運算符,我們可以有一個簡單的免費函數,它不需要知道成員函數的實現。通過constrast,如果你想重新實現從無到有的免費功能,那就需要訪問類,這通常是通過使免費功能的friend解決的私有成員,像這樣:

class MyClass 
{ 
    // as above 

    friend MyClass operator*(float val, MyClass const & x) 
    { 
     return MyClass(x.data_ * val); // access x's private member 
    } 
};