posts - 12,  comments - 21,  trackbacks - 0

#include <iostream.h>

class B

{

       int x,y;

public:

       B() {x = y = 0; cout << “Constructor1” << endl;}

       B(int i) {x = i; y = 0; cout << “Constructor2” << endl;}

       B(int i ,int j) {x = i; y = j; cout << “Constructor3” << endl;}

       ~B() {cout << “Destructor” << endl;}

       void print() {cout << “x=” << x << “,y=” << y << endl;}

};

void main()

{

       B *ptr;

       ptr = new B[3];

       ptr[0] = B();

       ptr[1] = B(5);

       ptr[2] = B(2,3);

       for (int i=0;i<3;i++)

              ptr[i].print();

       delete[] ptr;

}


运行结果为什么是:

Constructor1

Constructor1

Constructor1

Constructor1

Destructor

Constructor2

Destructor

Constructor3

Destructor

x=0,y=0

x=5,y=0

x=2,y=3

Destructor

Destructor

Destructor

它是如何调用构造函数和析构函数的???

思考以下我想可能是这样运行的:
B *ptr ;                  //建立一个指针对象 先调用一次构造函数B();
ptr=new  B[3];        //用new获取动态内存,并且建立了3个对象
ptr[0]=B();             //调用构造函数B()
ptr[1]=B(5);           //调用重载构造函数B(int i)
ptr[2]=B(2,3)          //调用重载构造函数B(int i,intj)
然后调用一次析构函数;
最后 delete[] ptr;    逆序调用三次析构函数.


posted on 2011-06-01 13:38 DoubleW 阅读(3239) 评论(2)  编辑 收藏 引用

FeedBack:
# re: 构造函数和析构函数调用问题
2011-06-02 08:46 | lwch
B* ptr并不会调用构造函数,只不过在栈上声明了一个指针对象。
new B[3]调用了3次构造函数,生成了3个对象。
B()调用了一次构造函数,因为它是在栈上生成的,因此这行代码执行完后会调用析构函数析构这个对象。
下面两句同上。
最后delete[] ptr因为有堆上3个对象,因此会被析构3次。

要记住栈上创建的对象会被自动析构,堆上创建的对象必须手动析构。  回复  更多评论
  
# re: 构造函数和析构函数调用问题
2011-06-02 11:45 | DoubleW
看懂了,多下阁下悉心教导。还望以后多家照顾..呵呵  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2011年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(3)

随笔档案(12)

文章档案(2)

最新随笔

搜索

  •  

积分与排名

  • 积分 - 28660
  • 排名 - 662

最新随笔

最新评论

阅读排行榜

评论排行榜