TreeMind树图在线AI思维导图
当前位置:树图思维导图模板资格考试计算机2020年全国计算机二级C++复习知识点:重载new和delete运算符思维导图

2020年全国计算机二级C++复习知识点:重载new和delete运算符思维导图

  收藏
  分享
免费下载
免费使用文件
同游生死 浏览量:02023-04-10 17:02:32
已被使用0次
查看详情2020年全国计算机二级C++复习知识点:重载new和delete运算符思维导图

备考2020年全国计算机二级考试的小伙伴们,复习的都怎么样了呢?树图网小编整理了2020年全国计算机二级C++复习知识点供大家参考复习,小伙伴们快来看看,测试一下自己吧!了解更多全国计算机二级考试敬请关注树图网计算机二级频道。

树图思维导图提供 2020年全国计算机二级C++复习知识点:重载new和delete运算符 在线思维导图免费制作,点击“编辑”按钮,可对 2020年全国计算机二级C++复习知识点:重载new和delete运算符  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:508c583c5415942d23a6f3a791583a5c

思维导图大纲

2020年全国计算机二级C++复习知识点:重载new和delete运算符思维导图模板大纲

2020年全国计算机二级C++复习知识点:重载new和delete运算符

前面已经介绍了如何用new和delete运算符函数来报考第管理内存,在那些例子中使用的都是全局的new和delete运算符。我们可以重载全局的new和delete运算符,但这不是好的想法,除非在进行低级的系统上或者嵌入式的编程。

但是,在某个类的内部重载new和delete运算符时可以的。这允许一个类有它自己的new和delete运算符。当一个类需要和内存打交道时,采用这种方法来处理其中的细节,可以获得很搞的效率,同时避免了使用全局new和delete运算符带来的额外开销。因为全局堆操作时调用操作系统函数来分配和释放内存,这样效率很低。

如果确定某个类在任何时候,其实例都不会超过一个确定的值,那么就可以一次性为类的所有实例分配足够的内存,然后用该类的new和delete运算符来管理这些内存。下面的程序说明了如何对new和delete进行重载。

#include iostream.h

#include string.h

#include stddef.h

#include new.h

const int maxnames = 5;

class Names

char name[25];

static char Names::pool[];

static bool Names::inuse[maxnames];

public:

Names(char* s) { strncpy(name,s,sizeof(name)); }

void* operator new(size_t) throw(bad_alloc);

void operator delete(void*) throw();

void display() const { cout < };

char Names::pool[maxnames * sizeof(Names)];

bool Names::inuse[maxnames];

void* Names::operator new(size_t) throw(bad_alloc)

for(int p=0; p {

if(!inuse[p])

inuse[p] = true;

return pool+p*sizeof(Names);

throw bad_alloc();

void Names::operator delete(void* p) throw()

if(p!=0)

inuse[((char*)p - pool)/sizeof(Names)] = false;

int main()

Names* nm[maxnames];

int i;

for(i=0; i {

cout < char name[25];

cin >> name;

nm[i] = new Names(name);

for(i=0; i {

nm[i]- >display();

delete nm[i];

return 0;

上面的程序提示输入5个姓名,然后显示它们。程序中定义了名为Names的类,它的构造函数初始化对象的name值。这个类定义了自己的new和delete运算符。这是因为程序能保证不会一次使用超过maxnames个姓名,所以可以通过重载默认的new和delete运算符来提高运行速度。

Names类中的内存池是一个字符数组,可以同时容纳程序需要的所有姓名。与之相关的布尔型数组inuse为每个姓名记录了一个true和false值,指出内存中的对应的项是否正在使用。

重载的new运算符在内存池中寻找一个没有被使用的项,然后返回它的地址。重载的delete运算符则标记那些没有被使用的项。

在类定义中重载的new和delete运算符函数始终是静态的,并且没有和对象相关的this指针。这是因为编译器会在调用构造函数之前调用new函数,在调用析构函数后调用delete函数。

new函数是在类的构造函数之前被调用的。因为这时内存中还不存在类的对象而且构造函数也没有提供任何初始化值,所以它不可以访问类的任何成员。同理,delete运算符是在析构函数之后被调用的,所以它也不可以访问类的成员。

相关思维导图模板

904名中国成年人第三磨牙相关知识、态度、行为和病史的横断面调查思维导图

树图思维导图提供 904名中国成年人第三磨牙相关知识、态度、行为和病史的横断面调查 在线思维导图免费制作,点击“编辑”按钮,可对 904名中国成年人第三磨牙相关知识、态度、行为和病史的横断面调查  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:10b9a8a2dd2fb4593f8130ef16c320fc

销售经理半年规划思维导图

树图思维导图提供 销售经理半年规划 在线思维导图免费制作,点击“编辑”按钮,可对 销售经理半年规划  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:e614d6bcf03e9318109240a18697c5d1