c++ 这是否违反了const的规则?[重复]

thtygnil  于 2023-04-08  发布在  其他
关注(0)|答案(2)|浏览(111)

此问题已在此处有答案

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属性的规则?

pkbketx9

pkbketx91#

const类的成员是constsize_t*的const版本是

size_t* const use;

这是一个size_t的常量指针,指向非常量对象use。你不能改变指针指向的内容,但是当你取消引用指针时,你会得到一个非常量对象,你可以修改它。

dluptydi

dluptydi2#

为什么use(++* rhs.use)指向的值可以修改?
use是一个指向非常量的指针,所以通过它修改是良构的。在本例中,它指向一个非常量的动态对象,所以修改所指向的对象是良构的。
这是否违反了const属性的规则?
不知道

相关问题