鉴于以下代码:

class TestA
{
    private:
        char Temp;

    public:
        char *Ptr;

        TestA(){Ptr = NULL; Temp = 'A'; Ptr = &Temp;}
        void Function(){Ptr = &Temp; Temp = 'B';}

        void operator=(const TestA &ItemCopy)
        {
            //ItemCopy.Temp = 'N'; //Not permitted
            printf("%c!\n",ItemCopy.Temp);
            Ptr = ItemCopy.Ptr; //This is okay
            *Ptr = 'M'; //This is okay, but it re-assigns ItemCopy.Temp. What?
            printf("%c!\n",ItemCopy.Temp);
        }
};

int main()
{
    TestA Temp1,Temp2;

    Temp1.Function();
    Temp2 = Temp1;
}

产生以下内容:



即使 ItemCopy 是常量。为什么允许我间接修改它甚至获取指针的非常量拷贝?

最佳答案

因为 ItemCopy 是常量,所以 ItemCopy.Ptr 具有 char * const 的有效类型。指针是常量,但指向的项目可以修改。这意味着分配:

*ItemCopy.Ptr = 'M';

是有意义的并且是允许的(底层对象本身不是 const ),复制指针并像您所做的那样通过它进行分配也是合法的。直接赋值 ItemCopy.Temp = 'M' 是不合法的,但这并不意味着如果有另一个非 ItemCopy.Temp 访问路径,您就不能修改变量 const

关于c++ - 为什么会出现这种情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7777965/

10-10 13:33