类只能生成栈对象(或只能生成堆对象)
一.类只能生成栈对象
将运算符new/delete进行重载,并放到private区域中,这样就不能通过new创建类的堆对象了。
#include<iostream>
#include <pthread.h>
#include<unistd.h>
using std::cout;
using std::endl;
class Student{
public:
Student();
~Student();
void print();
private:
void* operator new(size_t n);
void* operator new[](size_t n);
void operator delete(void* n);
void operator delete[](void* n);
int _id;
char *name;
};
Student::Student(){
cout << "Student" << endl;
}
Student::~Student(){
cout << "~Student()" << endl;
}
void* Student::operator new(size_t n){
cout << "overload new() " << endl;
void* ret = (Student*)malloc(n);
return ret;
}
void* Student::operator new[](size_t n){
cout << "overload new[]()" << endl;
void* ret = (Student*)malloc(n);
return ret;
}
void Student::operator delete(void* del){
cout << "overload delete" << endl;
if (del){
free(del);
del = NULL;
}
}
void Student::operator delete[](void* del){
cout << "overload delete[]" << endl;
if (del){
free(del);
del = NULL;
}
}
int main()
{
// Student* s = new Student[3]();//ERROR
// Student* s2 = new Student();//ERROR
Student s3;
return 0;
}
二.类只能生成堆对象
注意到这里申请堆空间和栈空间的一个差别:
1.Student s1
申请栈空间时,构造函数与析构函数都必须放在public区域里面,如果将~Student
放在private
区域,由于析构函数是自动调用的,所以Student s1
语句会显示错误;
2.Student *s2 = new Student()
申请堆空间时,就算将~Student()
放在private
区域也没关系,因为申请的堆空间必须主动delete
掉才行
3.但是注意:直接调用析构函数已经是不可能,因为析构函数已经在private
区域内部;
所以需要在类内部创建destory
函数,这样在destory
函数内部使用delete就可以被动调用析构函数了
#include<iostream>
#include <pthread.h>
#include<unistd.h>
using std::cout;
using std::endl;
//1.重载new和delete,内部实现用malloc和free
class Student{
public:
void print();
void destory();
Student();
private:
~Student();
int _id;
char *name;
};
Student::Student(){
cout << "Student()" << endl;
}
Student::~Student(){
cout << "~Student()" << endl;
}
void Student::destory(){
cout << "destory()" << endl;
if (this){
delete this;
//这里能否使用this->~Student()呢?
//不行,因为申请的堆空间并没有得到删除!而且,在进行delete操作之后也回自动调用~Student()
}
}
int main()
{
Student* s = new Student();
s->destory();
return 0;
}