整理至:链接
在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A ptr=new A;这两种方式是有区别的。
- 栈上:编译器在栈上分配内存,然后调用构造函数初始化内存空间
- 堆上:调用new分配合适的堆内存,然后调用构造函数初始化内存空间
1、只能建立在堆上
方法一:将构造函数设置为私有,这是不行的。因为operator new()函数只用于分配内存,无法提供构造功能,当构造函数设置为私有,就无法初始化内存。
方法二:将析构函数设置为私有(需要自定义一个内存释放函数),这是可以的。因为编译器在栈上创建对象时,会检查析构函数是否可以被调用,如果不可以被调用,那么就不可以调用创建栈上对象。
class A
{
public:
A(){}
void destory(){delete this;}
private:
~A(){}
};
如果A作为其它类的基类,则析构函数通常要设为virtual,然后在子类重写,以实现多态。因此析构函数不能设为private。所以析构函数一般设置为protected:
class A
{
public:
A(){}
void destory(){delete this;}
protected:
~A(){}
};
2. 只能在栈上分配类对象
禁用new就可以了。【注】重载了new就需要重载delete。
class A
{
private:
void* operator new(size_t t){} // 注意函数的第一个参数和返回值都是固定的
void operator delete(void* ptr){} // 重载了new就需要重载delete
public:
A(){}
~A(){}
};
标签:调用,限制,函数,对象,void,栈上,new,构造函数,delete
From: https://www.cnblogs.com/codingbigdog/p/17772298.html