const参考混淆与具体的例子

时间:2014-01-17 15:00:55

标签: c++

我有一个名为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
}

2 个答案:

答案 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被调用,但事实上,拷贝构造函数被调用(在这种情况下,它将是默认的一个,只使用一个浅的成员副本。)