2013-08-04 40 views
4

我有一個功能對象A有一對函數調用運營商的(線4和5):一對函數調用運營商

class A{ 
public: 
    A(int x) : _x(x){} 
    int operator()() const { return _x; } // line 4 
    int & operator()() { return _x; } // line 5 
private: 
    int _x; 
}; 

類似的對呼叫的運營商使用here。問題是:我是否需要第4行?第4行定義的操作符是否會被稱爲?在以下情況下:

A a(7); 
a() = 8; 
cout << a() << endl; 

總是調用第5行的運算符。

回答

4

是4號線將被使用,例如:

A a(3); 
const A b(2); 
a(); // from line 5 
b(); // from line 4 
3
int operator()() const { return _x; } 

將在您的對象爲const時調用。

還返回一個參考出來不是最好的設計,它打破了數據隱藏規則,set/get功能是更好的選擇。當你的第4行被調用或第5行被調用時,你會感到困惑。

我建議改寫爲:

class A{ 
public: 
    explict A(int x) : x_(x) {} 
    //int operator()() const { return x_; } // leave operator() for functor. 
    operator int() const { return x_; }   // use conversion function instead 
    void setX(int x) { x_ = x; } 
private: 
    int x_; //suggest use trailing `_` 
}; 
+3

* 「變量名以'_' 5月的衝突與標準庫變數。」 *。 ....名字'_x'很好。該標準不允許像'__x'或'_X'這樣的名稱,即以雙下劃線OR變量開始的變量,以單下劃線開頭,後跟大寫字母。 – Nawaz