为什么在C++中允许从外部修改常量对象的指针成员变量的内存?

Kri*_*f01 6 c++ pointers const transitivity

我一直试图理解当我在C++中使用常量参数和指针变量编写一个函数时,const标志不会保护底层内存不受修改.例如operator=(),在类的函数中执行以下操作是完全合法的X:

class X
{
public:
    X& operator=(const X& other)
    {
        this->data = other.data; //(*)
        return *this;
    }

private:
    int* data;
};
Run Code Online (Sandbox Code Playgroud)

(*):这与以下内容相同:

int* some_pointer;
int* const other_pointer = some_pointer;
int* class_pointer = other_pointer;
Run Code Online (Sandbox Code Playgroud)

但不一样:

const int* other_pointer; 
int* class_pointer = other_pointer;
Run Code Online (Sandbox Code Playgroud)

哪会产生以下错误:

error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
 int* class_pointer = other_pointer;
                      ^
Run Code Online (Sandbox Code Playgroud)

我理解为什么other.x要被铸造到一个,int* const但我不明白为什么它不是同时被铸造const* int(这是一个const int* const).当我用一个const参数编写一个函数时,我的逻辑表明该参数中的任何内容都应该继承constness,因为这应该是为了const保护底层数据不被修改的目的.

当从const类的版本外部访问指针成员时,我认为应该合理地期望对象的const关键字应该保护从类修改中出来的任何东西(甚至是内存).反对这一点的论点是外部记忆不属于对象,因此保护它也不应该是它的责任.我对它的看法是,在这种情况下(在任何其他情况下,当它被访问到其他任何类型的访问权限时),我们正在从一个const对象中取出一些东西.换句话说,它提供了对自身之外的东西的可见性.那么没有提高知名度的原因是什么const?那不会'

Bo *_*son 5

"当我用const参数编写函数时,我的逻辑表明该参数内的任何内容都应该继承const,因为这应该是const的目的,以保护底层数据不被修改."

你是对的,但是存储在X-object 内的指针指向对象外部.外部不受X常量的影响,只是存储在内部的数据X.


Mar*_*sen 0

int* const other_pointer
declare other_pointer as const pointer to int
Run Code Online (Sandbox Code Playgroud)

与以下相反:

const int* other_pointer
declare other_pointer as pointer to const int
Run Code Online (Sandbox Code Playgroud)

由http://cdecl.org/提供

请注意 const 位置的差异。