C++ 为什么我可以修改常量引用指向的对象

C++ 为什么我可以修改常量引用指向的对象,c++,reference,constants,C++,Reference,Constants,main()第2行:调用opearator+=函数并获取对只读对象的引用,因为它返回常量计数器& 我的问题是,, 在main()第3行:为什么现在允许我更改c1的状态/属性?我确实在+=运算符中以常量引用的形式返回了它。请解释一下,仅仅因为运算符+=将常量引用返回到计数器,它不会使c1成为常量计数器 如果尝试执行(c1+=c2).setCount(),则会失败,因为它将尝试调用运算符返回的对c1的常量引用上的非常量setCount方法+= 旁注:运算符+=的第二个参数可能是常量引用…c1不是常量

main()第2行:调用opearator+=函数并获取对只读对象的引用,因为它返回常量计数器&

我的问题是,,
在main()第3行:为什么现在允许我更改c1的状态/属性?我确实在+=运算符中以常量引用的形式返回了它。请解释一下,仅仅因为运算符+=将常量引用返回到计数器,它不会使
c1
成为常量计数器

如果尝试执行
(c1+=c2).setCount()
,则会失败,因为它将尝试调用运算符返回的对
c1
的常量引用上的非常量setCount方法+=

旁注:运算符+=的第二个参数可能是常量引用…

c1不是常量。您在main()第2行中将其声明为普通计数器,因此它是可修改的


该函数不被视为常量函数,因为关键字不在末尾。使用
Counter&operator+=(Counter&a,Counter&b)const
以这种方式声明函数(编译时会出现错误,
a.count=a.count+b.count;
不允许在const对象上使用)。

首先,如果所有
C1
未声明为
const变量。

在main()的第2行中所做的是调用
C1
上的
assignment
操作符,即
C1=C1+C2
。它接受
计数器类型的
常量引用
——但由于您未定义赋值运算符,编译器将为您执行此操作!因此,可以在
C1

上调用非常量成员函数,因为该函数被声明为friend而不是member,所以您实际上希望
const Counter&operator+=(const Counter&a,Counter&b)
具有常量。谢谢,我想做的是返回对只读对象的引用。我尝试了一个成员函数const int*getCount(){return&count;},它在main中为我提供了只读int。编译器还强制我在main()中使用常量int*,而不是int*。所以我想知道到底有什么区别。即使函数是const,稍后
c1.setCount()仍然有效。legalline 2正在调用由OP定义的
运算符+=
。无论如何,
运算符+=
没有隐式定义。
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();     
}