在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(){};
};