盼不吝赐教!!!!!!!!!!!

来源:百度知道 编辑:UC知道 时间:2024/06/08 16:15:06
#include<iostream>
using namespace std;
class Sample
{
int x;
public:
void init(){ x=1;}
void setX(int i)
{
if(i>0) x=i;
}
void printX()
{
cout<<x<<'\n';
}
};
void main(void)
{
Sample s;
s.init();
s.setX(-2);
s.printX();
s.setX(10);
s.printX();
*(int *)(&s)=-1;//A
s.printX();
}

初学C++,帮忙详细解答A行代码,在此多谢!事后定追加分!!!

&S 取得的是 S的物理地址,整个 (&S) 部分事实上已经是一个指向S的Sample类指针了。

(int *)是将一个指针强制转换为 int 类的指针。 由前面所述, (&S)是一个指向S的Sample类指针。 则(int *)(&S)则是将Sample类指针强制转换为int类指针。

在指针前使用的*号是deference operator(不好意思 不知道中文怎么说),其操作与&刚好相反。 &是取得某个对象的物理地址,而*取得的就是在这个物理地址上的对象。

由于指针存贮的是一个物理地址,所以想改变指针所指向的对象的值,就必须使用*来取得其所指向物理地址的对象。

至此 A行代码的意义已经十分明显, 在(int *)(&S)前面加*号表示取得这个int类指针所指向的对象。

*(int *)(&s)=-1则是将此对象赋值为-1.
此示例中,无法通过成员函数将Sample类的x值赋为负数,使用指针却可以做到,虽然这违反了信息隐藏的原则,但是也反映出指针是十分强大的,真是很好很强大啊。