C++实现一个只能在堆/栈上创建对象的类
1.C++中类对象的创建
在C++中,类的对象创建可以静态创建在栈区, 如A a;还可以动态创建在堆区,如A* ptr=new A;这两种方式是不同的。
静态建立一个类的对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。
动态建立类对象,是使用new运算符将对象建立在堆空间中, 是程序员主动申请的堆空间。这个过程分为两步,第一步是执行operator new()函数,在堆空间中搜索合适的内存并进行分配 ; 第二步是调用构造函数构造对象,初始化这片内存空间。这种方法会**间接调用类的构造函数*
2.设计一个类,该类只能在堆上创建对象
思路1:
①构造函数私有化:由于在栈上创建对象需要直接调用其构造函数,所以我们可以将其构造函数私有化,无法在类外部访问,即无法在栈上创建对象。还必须将拷贝构造私有化, 不然会出现用堆上创建好的对象拷贝构造一个栈上的对象这种情况发生。
②由于创建对象要调用构造函数, 在我们不定义其他构造函数时, 我们已经将两个默认构造函数私有, 在类外肯定是调用不到构造函数的。 我们只有定义一个公有的静态成员函数 ,在类内部用new在堆区创建对象并返回其指针。(在静态成员函数中用new 创建对象时, 也会调用构造函数。但静态成员函数不能调用成员函数, 那么new是如何调用构造函数的呢? 这得从静态成员函数为什么不能访问成员函数说起, 每一个非静态成员函数都有一个隐含的this指针, 访问成员变量实际上时通过this指针调用的, 而在构造函数调用前还没有实例化出对象, 也就不需要用this指针去访问。所以构造函数不需要this指针调用, 静态成员函数也就可以调用构造函数了。)
#include<iostream>
using namespace std;
class T
{
public:
int b;
//公有的静态成员函数 类内部用new在堆区创建对象并返回其指针
static T& newT(int val = 0)
{
return *new T(val);
}
private:
T(int val) :b(val)//构造函数私有化
{