为什么我能够修改const引用指向的对象

时间:2015-12-28 03:00:12

标签: c++ reference const

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引用返回。请解释

3 个答案:

答案 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成员函数。