c ++重载运算符,赋值,深层复制和加法

And*_*ndy 4 c++ operator-overloading deep-copy

我正在对操作员超载进行一些探索,同时重新阅读我的一些旧的大学教科书,我认为我误解了一些东西,所以希望这对于一些回答者来说会是一个很好的声誉.如果这是重复,请指出我正确的方向.

我创建了一个简单的计数器类,在(在这个阶段)有一个成员,val(一个int).

我初始化了其中三个计数器,varOne到varThree,并希望第三个计数器是前两个的总和(例如,varThree.val在下面的代码中设置为5)

counter::counter(int initialVal)
{
    val = initialVal;
    //pVal = new int;
    //*pVal = 10; // an arbitrary number for now
}

int main (int argc, char const* argv[])
{
    counter varOne(3), varTwo(2), varThree;
    varThree = varOne + varTwo;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经重载了operator +,如下所示:

counter operator+(counter& lhs, counter& rhs)
{
    counter temp(lhs.val + rhs.val);
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

我已经使它成为非成员函数,并且是计数器类的朋友,以便它可以访问私有值.

我的问题在添加另一个私有成员pVal(一个指向int的指针)时开始.添加这意味着我不能再进行简单的varThree = varOne复制了,因为当varOne被销毁时,varThree.pVal仍将指向相同的内存位.

operator=按如下方式重载.

int counter::getN()
{
    return *newVal;
}

counter& counter::operator=(counter &rhs)
{
    if (this == &rhs) return *this;
    val = rhs.val;
    delete pVal;
    pVal = new int;
    *pVal = rhs.getN();
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我做的事情像varThree = varOne所有正确的复制,但尝试做到varThree = varOne + varTwo会给我以下错误:

counter.cpp: In function ‘int main(int, const char**)’:
counter.cpp:96: error: no match for ‘operator=’ in ‘varThree = operator+(counter&, counter&)(((counter&)(& varTwo)))’
counter.cpp:55: note: candidates are: counter& counter::operator=(counter&)
make: *** [counter] Error 1
Run Code Online (Sandbox Code Playgroud)

看起来似乎counter::operator=无法应对来自的返回输出operator+,并且我需要operator=进一步超载以接受operator+返回的类型,但我没有运气,我开始认为也许我已经做了一些事情从根本上说是错误的.

小智 11

您需要将参数作为const引用传递.例如:

counter& counter::operator=( const counter &rhs )
Run Code Online (Sandbox Code Playgroud)

对于operator +()也是类似的.这是必要的,以便能够将临时值绑定到函数参数.按值返回时会创建临时值,因此当您说:

varOne + varTwo
Run Code Online (Sandbox Code Playgroud)

创建了一个无名临时文件.这是正确的做法,但你必须确保诸如赋值op之类的函数可以通过使它们的参数为const来接受这些值.

您还需要为您的类实现复制构造函数和析构函数,但缺少这些不会导致编译错误(不幸的是).