繁体   English   中英

c++中const成员函数的问题

[英]Question about const member functions in c++

谁能解释我这个错误? 这是代码:

class O{
    unsigned x;
    unsigned y;
    public:
        O(unsigned x_ ,unsigned  y_): x(x_), y(y_){
        };
        O& operator+= ( O & object){
            x += object.x;
        }
};

class A {
    O item;
    public:
        A(O i): item(i){;
        }
        void fun() const{
            O j(2,3);
            j += item;
        }
};

int main(){
    return 0;
}

当我尝试编译时,出现此错误:

In member function 'void A::fun() const':
[Error] no match for 'operator+=' (operand types are 'O' and 'const O')
[Note] candidate is:
[Note] O& O::operator+=(O&)
[Note] no known conversion for argument 1 from 'const O' to 'O&'

谁能给我解释一下? 如果我将 const 限定符添加到 += 运算符的参数,它会编译。 所以我认为问题在于我将 item 的引用传递给了 const 函数 fun() 中的非 const 运算符 += 。 谁能解释一下为什么这是非法的,以及我如何避免犯这种错误,例如,如果在使用 const 限定符等时有一些经验法则要遵循......?

这个成员函数

  void fun() const{
        O j(2,3);
        j += item;
    }

是一个常量成员函数。 因此,调用该函数的对象的成员被视为常量成员,特别是在这种情况下,数据成员项被视为声明如下

const O item;

在这个表达式中

j += item;

使用了成员函数

    O& operator+= ( O & object){
        x += object.x;
    }

接受对 O 类型对象的非常量引用。因此,实际上您正在尝试将非常量引用绑定到常量对象。 所以编译器会报错。

上述运算符的参数应使用限定符 const 声明并具有 return 语句,例如

    O& operator+= ( const O & object) {
        x += object.x;
        return *this;
    }

在许多地方, const关键字是一个承诺,即 [某些代码] 不会改变标记为const的事物的状态。 相比之下,关键字的缺失必须被解释为意味着 [某些代码]可能会改变该事物的状态。

编译器检查这些承诺是否一致,如果不一致则抱怨。

在这种情况下,您有一个声明

O& O::operator+= (O & object);

承诺保持参数object不变的地方。 并且因为这是一个参考参数,所以您不能保证单独提及所指的事物。

但是您尝试从上下文中调用该操作

void A::fun() const;

确实有希望保持调用对象不变的状态,然后使用它的成员之一( A::item )作为参数传递给O::operator+

编译器抱怨你在一个地方承诺保持A::item不变,而在另一个地方没有做出这个保证。

因为O::operator+=实际上并没有改变它的参数,你可以通过将签名更改为

O& O::operator+= (const O & object);

尘埃落定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM