class Counter {
int count;
void setCount()
{
this->count=10;
}
//declaration
friend const Counter& operator+=( Counter &a, Counter &b);
}
//definition
const Counter& operator+=(Counter &a, Counter &b) {
a.count = a.count + b.count;
return a;//returning reference to object a with const which makes object //pointed by ref. a read only in calling function
}
main() {
Counter c1,c2;
(c1+=c2);
c1.setCount();
}
main()第2行:调用opearator + = function并获取对readonly对象的引用,因为它返回const Counter&
我的问题是, 在main()第3行:为什么我现在可以更改c1的状态/属性?我确实在+ = operator中将它作为const引用返回。请解释
答案 0 :(得分:4)
仅仅因为你的运算符+ =返回一个对计数器的const引用,它不会使c1
成为一个const计数器。
如果您尝试执行(c1+=c2).setCount()
,那么会失败,因为它会尝试在对operator {=
c1
的const引用上调用非const setCount方法
旁注:operator + =的第二个参数应该是一个const引用...
答案 1 :(得分:0)
c1 不是一个const。你在main()第2行中将它声明为普通计数器,因此它是可修改的。
该函数不被视为const函数,因为关键字不在最后。使用Counter& operator+=(Counter &a, Counter &b) const
以这种方式声明函数(编译时会出错,但const对象上不允许a.count = a.count + b.count;
。)
答案 2 :(得分:-2)
首先,如果所有C1
未声明为const-variable
。
你在main()第2行中所做的是在assignment
上调用最终C1
运算符,即C1 = C1+C2
。它接受const-refernce
Counter
类型 - 但由于您没有定义赋值运算符,编译器会为您执行此操作!因此,可以在C1
上调用非const成员函数。