1) 前者是把new、delete运算符重载为private属性。后者是把构造、析构函数设为protected属性,再用子类来动态创建
2) 建立类的对象有两种方式:
① 静态建立,静态建立一个类对象,就是由编译器为对象在栈空间中分配内存;
② 动态建立,A *p = new A();动态建立一个类对象,就是使用new运算符为对象在堆空间中分配内 存。这个过程分为两步,第一步执行operator new()函数,在堆中搜索一块内存并进行分配;第二步调 用类构造函数构造对象;
3) 只有使用new运算符,对象才会被建立在堆上,因此只要限制new运算符就可以实现类对象只能建立 在栈上,可以将new运算符设为私有。
#include <iostream>
using namespace std;
//只能动态分配
class A
{
protected:
A(){}
~A(){}
public:
static A* create(){return new A();}
void destory(){delete this;}
};
//只能静态分配
class B
{
private:
void* operator new(size_t t){} //注意函数的第一个参数和返回值都是固定的
void operator delete(void* ptr){} //重载了new就需要重载delete
public:
B(){}
~B(){}
};
int main()
{
A* a = A::create();
B b;
return 0;
}