此问题已在此处有答案:
Why is it allowed in C++ to modify a constant object's pointer member variable's memory from outside?(4个答案)
4天前关闭。
一段简单的代码:
class HasPtr
{
public:
HasPtr(const string& s = string()) :ps(new string(s)), i(0), use(new size_t(1)) {}
HasPtr(const HasPtr& p) :ps(p.ps), i(p.i), use(p.use) { ++* use; }
HasPtr& operator=(const HasPtr&);
~HasPtr();
private:
string* ps;
int i;
size_t* use;
};
HasPtr& HasPtr::operator=(const HasPtr& rhs)
{
++* rhs.use;
if (-- * use == 0) {
delete ps;
delete use;
}
ps = rhs.ps;
i = rhs.i;
use = rhs.use;
return *this;
}
复制赋值操作符的参数是const。c++ primer说**const类型可以使用大多数但不是所有与其非const版本相同的操作。一个限制是我们只能使用那些不能使用对象的操作。*为什么use(++ rhs.use)指向的值可以在这里修改?这是否违反了const属性的规则?
2条答案
按热度按时间pkbketx91#
const
类的成员是const
。size_t*
的const版本是这是一个size_t的常量指针,指向非常量对象
use
。你不能改变指针指向的内容,但是当你取消引用指针时,你会得到一个非常量对象,你可以修改它。dluptydi2#
为什么use(++* rhs.use)指向的值可以修改?
use
是一个指向非常量的指针,所以通过它修改是良构的。在本例中,它指向一个非常量的动态对象,所以修改所指向的对象是良构的。这是否违反了const属性的规则?
不知道