电商素材网站,通信建设网站,电子商务的模式有哪些,免费设计logo的app对象创建限制在堆或栈 c类对象的创建方式对象创建限制在堆或栈C 中的类的对象的建立模式如何将类限制在堆上呢#xff1f;C 中的类的对象的建立模式
C 中的类的对象的建立模式分为两张#xff1a;静态建立#xff0c;动态建立
静态建立#xff1a;由编译器为对象在栈空间…对象创建限制在堆或栈 c类对象的创建方式对象创建限制在堆或栈C 中的类的对象的建立模式如何将类限制在堆上呢C 中的类的对象的建立模式
C 中的类的对象的建立模式分为两张静态建立动态建立
静态建立由编译器为对象在栈空间上分配内存直接调用类的构造函数创建对象。例如A a;动态建立使用 new 关键字在堆空间上创建对象底层首先调用 operator new() 函数在堆空间上寻找合适的内存并分配然后调用类的构造函数创建对象。例如A *p new A();
如何将类限制在堆上呢
直观的想法就是将构造函数设置为private这样静态建立就无法创建对象那么动态建立可以吗同样不行因为动态创建饶了半天也需要调用构造函数
方法一 将析构函数设置为私有原因静态对象建立在栈上是由编译器分配和释放内存空间编译器为对象分配内存空间时会对类的非静态函数进行检查即编译器会检查析构函数的访问性。当析构函数设为私有时编译器创建的对象就无法通过访问析构函数来释放对象的内存空间因此编译器不会在栈上为对象分配内存。
class A
{
public:A() {}void destory(){delete this;}private:~A(){}
};但是这个方法有个问题就是外部用delete的时候析构函数由于是私有的就无法释放空间。那么就需要在内部实现delete释放空间。继承的时候如果基类将析构函数设置为虚函数派生类重写该虚函数来实现多态由于基类析构函数是私有的派生类就无法访问。
方法二 构造函数设置为 protected并提供一个 public 的静态函数来完成构造而不是在类的外部使用 new 构造将析构函数设置为 protected。原因类似于单例模式也保证了在派生类中能够访问析构函数。通过调用 create() 函数在堆上创建对象。
class A
{
protected:A() {}~A() {}public:static A *create(){return new A();}void destory(){delete this;}
};限制对象只能建立在栈上
解决方法将 operator new() 设置为私有。原因当对象建立在堆上时是采用 new 的方式进行建立其底层会调用 operator new() 函数因此只要对该函数加以限制就能够防止对象建立在堆上。
class A
{
private:void *operator new(size_t t) {} // 注意函数的第一个参数和返回值都是固定的void operator delete(void *ptr) {} // 重载了 new 就需要重载 delete
public:A() {}~A() {}
};