环境:VS2010
问题:
1.如何让一个类的对象只能够在堆上创建(即使用new创建,如:T *p=new T;), 而不能在栈上创建(即直接申明方式,如:T t;);
2.如何让一个类的对象只能够在栈上创建(即直接申明方式,如:T t;),而不能在堆上创建(即使用new方式,如:T *p=new T;);
解决:
1.只能使用new创建,而不能使用申明明方式,只需要把类T的析构函数设为私有即可。
2.只能使用申明方式,而不能使用new新建,只需要把new和delete运算符设为私有,并重载这两个运算符。
代码:(只给出头文件和主函数)
问题1:
#include <iostream>
using namespace std;
#ifndef HEAD_H
#define HEAD_H
class T{
public:
void*operator new(size_t s){
void*p = new char[s];
cout<<"调用函数new(size_t s)分配空间,空间为"<<s<<endl;
returnp;
}
void operator delete(void *p){
delete(p);
cout<<"调用函数delete(void *p)释放空间"<<endl;
}
void Test();
void Delete();
T();
private:
~T();
int i;
};
#endif
#include "head.h"
#include <iostream>
using namespace std;
int main(void){
T*t1;
t1= new T;
t1->Test();
t1->Delete();
return0;
}
注意:这里要写一个成员函数对new的对象进行delete。
问题2:
#include <iostream>
using namespace std;
#ifndef HEAD_H
#define HEAD_H
class T{
public:
T();
~T();
voidTest();
private:
void *operatornew(size_t s){
void *p = new char[s];
cout<<"调用函数new(size_t s)分配空间,空间为"<<s<<endl;
return p;
}
void operatordelete(void *p){
delete (p);
cout<<"调用函数delete(void *p)释放空间"<<endl;
}
int i;
};
#endif
#include "head.h"
#include <iostream>
using namespace std;
int main(void){
Tt;
t.Test();
return0;
}