在C++中,创建类的对象有两种方法,一种是静态建立,A a; 另一种是动态建立,调用new 操作符。
一、只能在堆上创建对象
- 就是动态建立类的对象,使用new操作符来完成。
- 做法一:将该类的构造函数和析构函数权限设为protected,(可以让该类可以被继承),然后定义两个static 函数来调用new ,delete 来创建和销毁对象。
class A
{
protected:
A()
{};
~A()
{};
static A* Create()
{
return new A();
}
static void Destory(A* p)
{
delete p;
p = NULL;
}
};
- 做法二:
对象建立在栈上面时,是由编译器分配空间的,调用构造函数来构造栈对象,当对象使用完之后,编译器会调用析构函数来释放栈对象所占的空间,编译器管理了对象的整个生命周期,编译器为对象分配空间的时候,只要是非静态的函数都会检查,包括析构函数,但是此时析构函数不可访问,编译器无法调用类的析构函数来释放内存,那么编译器将无法在栈上为对象分配内存。
class A
{
public:
A()
{
cout << "A()" << endl;
}
private:
~A()
{
cout << "~A()" << endl;
}
};
int main()
{
//A a;//栈上创建
A* p = new A;//堆上创建
return 0;
}
二、只能在栈上创建对象
- 只能在栈上创建的对象的话,就是不能调用new 操作符,所以可以将operator new 和operator delete 设置为私有的。
class AA
{
private:
void* operator new(size_t)
{};
void operator delete(void*)
{};
public:
AA()
{
cout << "AA()" << endl;
}
~AA()
{
cout << "~AA()" << endl;
}
};
三、只能创建一个对象
- 在类中创建一个静态变量Count,用来限制可创建的实例的数量。
class singleclass
{
public:
static singleclass* getsingleclass()
{
if (count > 0)
{
count--;
return new singleclass();
}
else
{
return NULL;
}
}
private:
static int count;
singleclass(){};
};