我有一个名为counter的类,我的赋值运算符如下所示:
const counter& counter::operator=(const counter& y)
{
count = y.count;
return *this;
}
现在,我的困惑源于返回值:
const counter& counter:: ...
我认为这意味着计数器的赋值运算符应该返回一个const计数器引用,因为它是const,该对象应该是不可变的,但据我所知,它不是。
这是我的counterTest代码,我已经评论了我的担忧:
#include "counter.h"
#include <iostream>
using std::cout;
using std::endl;
int main()
{
counter c; // c.count = 0
c.Inc(); // c.count = 1
c.Inc(); // c.count = 2
counter c2;
// Here I use my assignment operator so shouldn't c2 be immutable?
c2 = c; // c3.count = 2
// Why does this work?
c2.Inc(); // c3.count = 3
c2.Inc(); // c3.count = 4
cout << "c = " << c.Count() << ", c2 = " << c2.Count()
<< endl; // prints: c = 2, c2 = 4
}
答案 0 :(得分:6)
这是您声明c2
:
counter c2;
如您所见,它不是const
。这永远不会改变。您的作业无法更改const
的{{1}}。
在赋值函数中,c2
引用您指定的对象,而不是返回值。返回值是表达式*this
的值。因此,如果您尝试修改结果,可能使用c2 = c
,则无效,因为返回值为(c2 = c).Inc()
。
我注意到您似乎认为const
是函数的返回类型。实际上,只有const counter& counter::
。 const counter&
部分是嵌套的名称说明符,表示counter::
函数是operator=
类的成员。
counter
答案 1 :(得分:0)
使用
const counter& counter::operator=(const counter& y)
您只需更改标准operator=
的含义,该标准将被定义为counter& counter::operator=(const counter& y)
,但您无法以此特殊形式将其连接起来:{{1} }。或者也不是(a=b)=c
。但是正常的(a=b).Inc()
是可能的。
在使用任何运算符之前,必须将变量明确定义为a=b=c
。 之后无法获取const
,具体取决于返回类型。因此,就像已经说过的那样,你需要将c2定义为const。
修改强>
你也应该考虑编写一个自己的拷贝构造函数,因为const
只会看起来像const c2 = c
被调用,但事实上,拷贝构造函数被调用(在这种情况下,它将是默认的一个,只使用一个浅的成员副本。)