为什么会这样?

SSi*_*ht3 3 c++ const

给出以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

产生以下内容:

B
M.

即使ItemCopy是常量.为什么我被允许间接修改它甚至采用指针的非常量副本?

CB *_*ley 9

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

*ItemCopy.Ptr = 'M';
Run Code Online (Sandbox Code Playgroud)

是有意义的和允许的(底层对象本身不是const),复制指针并通过它完成分配也是合法的.直接分配ItemCopy.Temp = 'M'不合法,但这并不意味着如果您ItemCopy.Temp有其他非const访问路径,则无法修改变量.