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

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

}


 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值