一对函数调用运算符

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

这里使用了类似的调用运算符,可以在这里查看。问题是:我是否需要第4行?定义在第4行的运算符会被调用吗?在以下情况下:

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

总是会调用第5行的操作符。

2个回答

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
变量名以“_”开头可能会与标准库变量冲突。名称“_x”没问题。标准不允许使用“__x”或“_X”之类的名称,即以双下划线开头或以单下划线加大写字母开头的变量。 - Nawaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接