首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于构造函数与new,delete的有关问题

2012-03-31 
关于构造函数与new,delete的问题(1)构造函数可以是常函数或者静态函数吗?(2)#includeiostreamusingnames

关于构造函数与new,delete的问题
(1)构造函数可以是常函数或者静态函数吗?
(2)
#include   <iostream>
using   namespace   std;
class   Test   {
public:
Test(   )   {   n+=2;   }
~Test(   )   {   n-=3;   }
static   int   getNum(   )   {   return   n;   }
private:
static   int   n;
};
int   Test::n   =   1;
int   main(   )
{
Test*   p   =   new   Test;
delete   p;
cout   < <   "n= "   < <   Test::getNum(   )   < <   endl;
return   0;
}
上面的程序输出结果是0还是-3?用new赋值后会自动调用delete函数吗?Test*   p   =   new   Test;这一句执行完后n的值是几?上面的程序共调用了几次析构函数?另,据说析构函数也是自动调用的,是不是用new赋值的对象调用delete后就不再另外调用析构了?

[解决办法]
(1)构造函数可以是常函数或者静态函数吗?

不可以.


(2)上面的程序输出结果是0还是-3?用new赋值后会自动调用delete函数吗?Test* p = new Test;这一句执行完后n的值是几?上面的程序共调用了几次析构函数?另,据说析构函数也是自动调用的,是不是用new赋值的对象调用delete后就不再另外调用析构了?

输出应该是0.
并不是因为new赋值后会自动调用delete函数,
而是这样的:

首先要知道,静态成员在程序的执行过程中是一直存在并且只被初始化一次的.

程序编译的时候,先给静态成员赋值,些时,n=1;
Test* p = new Test; 之后,申请了一个堆对象,这时,调用构造函数,静态成员n+=2,n=3;
delete p之后,调用这个堆对象的析构函数,n-=3,n=0;
所以再调用Test::getNum( ) 的结果是0


[解决办法]
MyClass p1, *p2 //p1调用缺省构造函数,输出A. p2没有
p2=new MyClass(‘X’); //动态申请一个新的MyClass对象,调用单参构造函数,输出C
delete p2; //删除了这个动态申请的对象,调用析构函数,输出B
//p1 的生命期到此结束,调用析构函数,输出B

热点排行