鉴于以下代码:
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/