360怎么用qq登陆:C++问题,错在哪里?

来源:百度文库 编辑:高校问答 时间:2024/04/30 20:45:05
class A
{
int *ptra;
int a;
public:
A (int x = 0, int y = 0);
~A();

public:
void put();
void set(int x, int y, A obj );
};
A::A(int x, int y)
{
ptra = NULL;
ptra = new int;
assert(NULL != ptra);
*ptra = x;
a = y;
}
A::~A()
{
assert(NULL != ptra);
delete ptra;
}
void A::put()
{
cout << *ptra << " | "<< a << endl;
return;
}
void A::set(int x, int y, A obj)
{
*(obj.ptra) = x;
obj.a = y;
return;
}
void main ()
{
A obj;
obj.put();
/*这里对象obj是传值调用的方式给成员函数使用的,但是对象obj的成员ptra指向的变量(由构造函数动态分配)被修改了而a却没有。这是为什么啊?
*/
obj.set(100, 300, obj);
obj.put();

return;
}

你也说了是传值调用。
一般传值调用就是说,在内存中开辟一段新的空间来临时存放参数(函数调用完之后就放掉,一般是在堆栈)。那么,对于在临时空间的obj,ptra是地址,所以通过*可以修改该地址指向的值,而临时空间的obj.a则不同了,只是一个int而已,只能影响到其临时空间的本身,一旦函数调用结束,就失效了。
这里的道理和“为什么一般调用不能改变参数的值而一定要用地址调用才可以”是一样的。
void A::set(int x, int y, A obj)
{
*(obj.ptra) = x;
obj.a = y;
return;
}
这个函数的意思是:通过本实例的本函数,修改另一实例的域中的值,本就不是设置自己的值哈

构造函数要有析构函数的...........

void set(int x, int y, A obj );改成
void set(int x, int y);

*(obj.ptra) = x;
obj.a = y;
去掉obj,如果实在要用,用this就可以了。
obj.set(100, 300, obj);
改成
obj.set(100, 300);
一切ok了。
我帮你调试过了

这么简单的问题都不能解决
菜啊