C++的一道“怪题”,请高手指教:

来源:百度知道 编辑:UC知道 时间:2024/05/18 09:48:30
概述如下:
void main()
{
Savings saObj1("3277",7000);
Savings saObj2("3279",5000);
Checking chObj1("8888");
Checking chObj2("398",10000);
list<Account*> we;
we.push_back (&saObj1);
we.push_back (&saObj2);
we.push_back (&chObj1);
we.push_back (&chObj1);
for( list< Account *>::iterator it = we.begin (); it != we.end(); ++it)
(*it)->display();//可以正常显示
ifstream in("account.txt");
Savings *x;
Checking *y;

while(s != "x 0")
{
getline(in, s);
{
if(s1 == "savings")
{
x = new Savings(s2,s3);//此处如果用Savings x(s2,s3)直接定义,则在循环外面输出时,不能够正常输出,为什么一定要用New 去定义对象。将他的内容放到we里不就可以不用管了吗?为什么非要用堆的对象才可以?

we.push_back (x);
}
else
{
y = new Checking(s2,s3);
we.push_back (y);
}

如果Savings x(s2,s3)直接定义
we.push_back(&x); 以后,
再循环的时候不再改变x的地址(也就是说,原来的数据会被覆盖。你可以自己做实验)

而new则是分配新的内存空间,不会覆盖原来数据(但这样做有可能造成内存泄漏,当然这是另一回事了)

不知你明白了吗?