关于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 的引用传递给常量函数 fun() 中的 += 运算符,它不是常量。任何人都可以解释为什么这是非法的,以及我如何避免犯这种错误,例如,如果在使用 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
的事物的状态。相比之下,缺少关键字必须被解释为意味着 [一些代码] 可能 改变那个东西的状态。
编译器检查这些 promises 是否一致,如果不一致则抱怨。
在这种情况下你有一个声明
O& O::operator+= (O & object);
你不承诺保持参数object
不变。因为这是一个参考论点,所以你不能保证单独留下所指的东西。
但是您尝试从上下文中调用该操作
void A::fun() const;
承诺保持调用对象的状态不变,然后使用其中一个成员 (A::item
) 作为 O::operator+
的参数.
编译器抱怨您在一个地方承诺保持 A::item
不变,而在另一个地方却没有做出保证。
因为 O::operator+=
实际上并没有改变它的参数,你可以通过将签名更改为
来解决这个问题
O& O::operator+= (const O & object);
大功告成。
谁能解释一下这个错误? 这是代码:
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 的引用传递给常量函数 fun() 中的 += 运算符,它不是常量。任何人都可以解释为什么这是非法的,以及我如何避免犯这种错误,例如,如果在使用 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
的事物的状态。相比之下,缺少关键字必须被解释为意味着 [一些代码] 可能 改变那个东西的状态。
编译器检查这些 promises 是否一致,如果不一致则抱怨。
在这种情况下你有一个声明
O& O::operator+= (O & object);
你不承诺保持参数object
不变。因为这是一个参考论点,所以你不能保证单独留下所指的东西。
但是您尝试从上下文中调用该操作
void A::fun() const;
承诺保持调用对象的状态不变,然后使用其中一个成员 (A::item
) 作为 O::operator+
的参数.
编译器抱怨您在一个地方承诺保持 A::item
不变,而在另一个地方却没有做出保证。
因为 O::operator+=
实际上并没有改变它的参数,你可以通过将签名更改为
O& O::operator+= (const O & object);
大功告成。