如何定义定义一个只能在栈上生成对象的类???
这种题主要考的是对C++语法的理解,以及对C++语法的运用。
分析:
对象可以在栈上生成也可以由我们在堆上new出来。要想只在栈上生成对象而不能在堆上生成对象在类外
是无法完成的,我们必须从类的内部入手。
第一种方法时:我们知道类对象的构造是由构造函数完成的,如果我们把构造函数声明为私有或者保护类
型,那么在类外就不能调用构造函数,也就不能在类外面new出对象。但这样同时也不能在类
外定义对象。对此,我们需要在类里定义一个公有接口来返回成员函数的对象,之后在类外定
义类时,只需要调用这个函数即可。但这样还是有缺陷的,因为在类外只能通过类的对象来调
用这个成员函数,所以应该将这个接口声明为静态的。
//方法一
#include <iostream>
using namespace std;
class Stack
{
private:
Stack(int stack = 0)
:_stack(stack)
{}
public:
static Stack GetStackMemory()
{
return Stack();
}
protected:
int _stack;
};
int main()
{
Stack stack = Stack::GetStackMemory();
cout << "Sucess" << endl;
return 0;
}
还有第二种方法:只声明operator new和operator delete而不定义。使用 new 关键词操作,其
过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构
造函数生成对象。将 new 操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对
象。但这个方法存在一个缺陷,就是防止不了在静态区定义对象。
//方法二
class Stack
{
private:
void* operator new(size_t size); // 注意函数的第一个参数和返回值都是固定的
void operator delete(void* p); // 重载了new就需要重载delete
protected:
int _stack;
};
Stack aa; //此方法的缺陷在于防止不了在静态区定义对象
int main()
{
//AA* p = new AA; //失败(operator new+构造)
Stack stcak;
cout << "Sucess" << endl;
return 0;
}