{
     A a;
     p = &a;
  }<-问题就在这里!
去掉{}就好了,原因是编译器把{}中的东东看成函数,C中好像就是这样的。
我在写for(int i=0; i<10; i++)
          for(int j=0; j<10; j++)
时它还说俺j重复定义呢。

解决方案 »

  1.   

    Func的存在和a的作用域没有关系。
    就算a指针没有初始化,Func也是可以用的,因为Func不是虚函数的缘故。
    这在前面的贴子里讨论过了。
      

  2.   

    不是看成函数
    是域限定附
    就像
    for(;;)
    {
     int a=0;
    }
    一样
      

  3.   

    对的啊!
    你的a离开{}后就会被析构,所以运行~A,不行你试图跟踪运行运行。
    然后你的p->Func()后被执行,所以这样输出。
      

  4.   

    这其实是一个非法的操作,只是没出异常罢了。
    如果你在vc7生成.exe则生成的代码应该会执行出错,
    出现这样结果的原因是对象析构后原对象已经取不到原对象空间的值了,
    而p是一个指针,它指向原对象地址,只要原地址中的值还没有被冲,则就会执行出结果来,所以就不奇怪了(C/C++不检查越界)
      

  5.   

    {
      A *p;
      {
         A a;
         p = &a;
      } //A a 变量生命周期结束,输出“Destruction”,但是这时的A p仍然存活。
      p->Func();//输出“hello”
    }
      

  6.   

    跟a的对象无关,因为Func不是虚函数,所以它的函数入口地址是固定的,与对象无关,请看下例,当然,这种写法肯定是不规范的。
    但是如果你把Func设成virtual就会出错,因为虚函数与对象相关.
    #include <iostream.h>class A
    {
    public:
    ~A(){ cout << "Destruction" << endl; }
    void Func(){ cout << "Hello" << endl;}
    };void main()
    {
    A *p = NULL;
    p->Func();
    return;
    }
      

  7.   

    没错,在脱离大括号的作用域以后,a调用析构,所占用空间释放,但注意,所谓释放,只是通知操作系统“这段内存我不用了,你可以把它分配给其他程序了“,在操作系统未重新分配之前,他原来所占用空间的内存不变,Fun()在代码段的内容仍被保留,所以调用p->Fun();仍有输出。但前提是该函数不能调用任何涉及到this指针的成员函数(虚函数)或成员变量,因为对象已经释放,以没有this指针了(为空)。例如你把上述程序改为:
    #include <iostream.h>class A
    {
    int i;
    public:
      ~A(){ cout << "Destruction" << endl; }
      void Func(){ cout << "Hello" <<i<< endl;}
    };main()
    {
      A *p;
      {
         A a;
         p = &a;
      }
      p->Func();
    }
    执行就会出错。
      

  8.   

    一点也没有错。p 的实例的却不存在了,就是说,p已经没有封装任何数据了,但是,一个类的实例们的成员函数只有一个地址,就是说,只有一个成员函数存在,另外编译器一般会把成员函数调用到的数据成员加以this指针以确认。本例中,func()没用引用任何数据成员,因此,即使this指针已不存在,该函数照样能跑。
      

  9.   

    我同意zzq_fortu(郑)和 wersly(技术很差) 的解释。 更同意sun2000(sun)的解释
      

  10.   

    cmoth(容量够大) (  ) 回答的好。
      

  11.   

    谢谢cmoth(容量够大),我觉着你的解释最完美。
    也谢谢sun2000(sun)和e_notimpl(e_notimpl)让我看到了另外一些问题。
    谢谢所有人的热情参与……散分!