关于构造函数与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