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