C++两种方式创建对象(new和申明)

来源:互联网 发布:好的配音软件 编辑:程序博客网 时间:2024/05/21 15:50

环境: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_Hclass 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_Hclass 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;}