给出以下代码:
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是常量.为什么我被允许间接修改它甚至采用指针的非常量副本?
因为ItemCopy是const,ItemCopy.Ptr有和有效的类型char * const.指针是const,但可以修改指向的项目.这意味着分配:
*ItemCopy.Ptr = 'M';
Run Code Online (Sandbox Code Playgroud)
是有意义的和允许的(底层对象本身不是const),复制指针并通过它完成分配也是合法的.直接分配ItemCopy.Temp = 'M'不合法,但这并不意味着如果您ItemCopy.Temp有其他非const访问路径,则无法修改变量.