您的位置:首页 > 其它

两个关于类的创建的问题

2011-05-08 12:13 155 查看
<一>、使一个对象可以在堆上创建,但是不能在栈上创建

步骤一:使类的所有构造函数私有化

Class A

{

Private:

A(){}

};

Int main()

{

A a;//在栈上创建对象,会出现编译错误

}

这时,已经实现了禁止对象在栈上的创建,但是同时也禁止了对象的实例化,也就是说类A也不能在堆上创建,为了实现能够在堆上创建A类的对象,请进行第二步操作。

步骤二:

Class A

{

Public:

Static A* newInstance()

{

Return new A;

}

Private:

A(){}

};

Int main()

{

A a;//在栈上创建对象,会出现编译错误

A* a = A::newInstance();//成功在堆上创建对象

}

这时出现了内存泄漏,因为在堆上分配的内存无法释放掉,为了实现内存的释放,请进行第三步操作。

步骤三:

Class A

{

Public:

Static A* newInstance()

{

Return new A;

}

Static void deleteInstance(A* a)

{

If (a != NULL)

{

Delete a;

}

}

Private:

A(){}

};

Int main()

{

A a;//在栈上创建对象,会出现编译错误

A* a = A::newInstance();//成功在堆上创建对象

A::deleteInstance(a);//成功释放内存

}

<二>、使一个对象可以在栈上创建,但是不能在堆上创建

方法是通过重载new和delete操作符并且私有化,这样就可以禁止对象在堆上分配了(因为一个对象在堆上的创建只能通过new来实现)

Class A

{

Private:

Void* operator new (size_t size)

{

Return malloc(size);

}

Void operator delete(void* ptr)

{

If (ptr)

Free(ptr);

}

Public:

A(){}

}

Int main()

{

A a;//在栈上创建,正确

A* a = new A;//在堆上创建,编译错误

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: