我正在学习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
。为什么这不会引起任何运行时错误?