为什么在自分配情况下,副本分配运算符参考固定不变的工作?

时间:2019-03-26 13:15:58

标签: c++ copy-assignment

我正在学习C ++类中的复制控件。假设我有一个 hasPtr 类,其中包含一个动态分配的字符串指针成员 ps 。我希望类在复制/分配情况下表现出类似值的行为。代码看起来像这样


#include <iostream>
#include<string>

class hasPtr{

public:

    // constructor
    hasPtr(const std::string &s = std::string()) : ps(new std::string(s)) {
    }

    // copy-constructor
    hasPtr(const hasPtr &rhs) {
        ps = new std::string(*rhs.ps);
    }

    // copy-assignment operator
    hasPtr& operator = (const hasPtr &rhs) { // <------ how does this work in a self-assignment situation? 

        auto psTemporary = new std::string (*rhs.ps);
        delete ps;
        ps = psTemporary;
        return *this;
    }

    // destructor
    ~hasPtr(){
        delete ps;
    }

    // method to get string value
    inline const std::string& getValue() const {
        return *ps;
    }

private:
    std::string *ps;
};


int main(){

    hasPtr object1("Object1");
    object1 = object1;
    std::cout << object1.getValue() << std::endl;
    return 0;
}

我对自赋值情况下的副本赋值运算符有些疑惑。复制分配运算符的参数为const hasPtr &rhs,它是对常量 hasPtr 对象的引用;因此,不应允许我在复制分配运算符内部修改rhs对象。但是,在自分配方案中,当执行delete ps;时,实际上正在修改rhs。为什么这不会引起任何运行时错误?

0 个答案:

没有答案