• operator new/delete 预定义的内存
    • operator new/delete 语法格式
    • 举例说明

operator new/delete 预定义的内存

适用于极个别情况需要定制的时候才用的到。一般很少用,比如定制内存。

operator new/delete 语法格式

void * operator new(size_t);
void operator  delete(void *);
void * operator new[](size_t);
void operator delete[](void *);

举例说明

使用:void * operator new(size_t);

#include <iostream>
#include <memory>
using namespace std;class A
{public:A(){}~A(){cout << "~A()" << endl;}void func(){cout << x <<"  " << y << endl;}void* operator new(size_t size){cout << "void* operator new(size_t)" << endl;cout << size << endl;void* p = malloc(size);((A*)p)->x = 100;//底层提前初始化  写死((A*)p)->y = 200;//底层提前初始化    写死return p;}
private:int x;int y;
};int main()
{A* pa = new A;pa->func();return 0;
}

运行结果:

上面代码有问题,只有malloc申请内存,没有free释放内存,通过引入void operator delete(void *);进行说明:

#include <iostream>
#include <memory>
using namespace std;class A
{public:A(){}~A(){cout << "~A()" << endl;}void func(){cout << x <<"  " << y << endl;}void* operator new(size_t size){cout << "void* operator new(size_t)" << endl;cout << size << endl;void* p = malloc(size);((A*)p)->x = 100;//底层初始化    写死((A*)p)->y = 200;//底层初始化  写死cout << p << endl;return p;}void operator  delete(void* p){cout << "operator  delete(void* p)" << endl;cout << p << endl;free(p);}private:int x;int y;
};int main()
{A* pa = new A;pa->func();delete pa;return 0;
}

运行结果:

使用void * operator new[](size_t);

#include <iostream>
#include <memory>
using namespace std;class A
{public:A(){cout << "A()" << endl;}~A(){cout << "~A()" << endl;}void func(){cout << x <<"  " << y << endl;}void* operator new(size_t size){cout << "void* operator new(size_t)" << endl;cout << size << endl;void* p = malloc(size);((A*)p)->x = 100;//底层初始化    写死((A*)p)->y = 200;//底层初始化  写死cout << p << endl;return p;}void operator  delete(void* p){cout << "operator  delete(void* p)" << endl;cout << p << endl;free(p);}void* operator new[](size_t size){cout << "void* operator new[](size_t size)" << endl;cout << size << endl;void* p = malloc(size);return p;}private:int x;int y;
};int main()
{A* pa = new A[10];return 0;
}

运行结果:

多出来的4字节用于记录 A* pa = new A[10];中的10。

使用void operator delete[](void*);

#include <iostream>
#include <memory>
using namespace std;class A
{public:A(){cout << "A()" << endl;}~A(){cout << "~A()" << endl;}void func(){cout << x <<"  " << y << endl;}void* operator new(size_t size){cout << "void* operator new(size_t)" << endl;cout << size << endl;void* p = malloc(size);((A*)p)->x = 100;//底层初始化    写死((A*)p)->y = 200;//底层初始化  写死cout << p << endl;return p;}void operator  delete(void* p){cout << "operator  delete(void* p)" << endl;cout << p << endl;free(p);}void* operator new[](size_t size){cout << "void* operator new[](size_t size)" << endl;cout << size << endl;void* p = malloc(size);cout << p << endl;return p;}void operator delete[](void *p){cout << "void operator delete[](void *p)" << endl;cout << p << endl;free(p);}private:int x;int y;
};int main()
{A* pa = new A[10];delete []pa;return 0;
}

运行结果:

operator new/delete,operator-> / *【C++运算符重载】相关推荐

  1. c++运算符重载总结

    c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁.高效.在c++中不止函数可以重载,运算符也可以重载.由于一般数据类型间的运算符没有重载的必要, ...

  2. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  3. c 运算符重载总结

    目录 1.一般运算符重载 2.关系运算符重载 3.逻辑运算符重载 4.单目运算符重载 5.自增减运算符重载 6.位运算符重载 7.赋值运算符重载 8.内存运算符重载 9.特殊运算符重载 10.总结 c ...

  4. 运算符重载(加减运算符、前置加加(减减)后置加加(减减)运算符、赋值运算符、输入输出运算符、关系运算符、函数调用)

    编译器对于一个类会默认生成以几种函数: 1.默认构造函数(空形参,空函数体) 2.默认拷贝构造函数(浅拷贝,也叫值拷贝.字节拷贝) 3.析构函数(空形参,空函数体.析构函数要求形参列表必须是空的,所以 ...

  5. C++学习笔记:(四)运算符重载 类型转换

    目录 6.运算符重载 6.1运算符重载的基本概念 6.2成员函数重载运算符 6.3友元函数重载运算符 6.4成员函数重载运算符和友元函数重载运算符比较 6.5类型转换 6.运算符重载 面向对象程序设计 ...

  6. 运算符重载的基本规则和习语是什么?

    问: 注意:答案是按特定顺序给出的,但是由于许多用户根据投票而不是给出的时间对答案进行排序,所以这里是一个按最有意义的顺序排列的答案索引: C++中运算符重载的一般语法 C++中运算符重载的三个基本规 ...

  7. C++运算符重载详解

    目录 什么是运算符重载 运算符重载的意义 运算符重载的语法格式 简单例子 "+"运算符的重载 代码分析 运算符重载的两种方式 1,重载为类的成员函数 (1),双目运算符 (2),单 ...

  8. C++中的运算符重载

    1.Cpp中的重载运算符和重载函数 C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但 ...

  9. C++中运算符重载的方法

    **#include<iostream> using namespace std; class Complex{ public:Complex(){real=0;imag=0;}Compl ...

  10. 【C++】C++类的学习(三)——运算符重载与友元函数

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前面的两篇博文中介绍了类的一些基本特性,今天讲一讲运算符重载和友元. 运算符重载 运算 ...

最新文章

  1. 计算机视觉大规模爆发,6大细分领域将撑起725亿元市场
  2. 2016抢票软件分享
  3. opencv的ROI操作
  4. phpexcel用法(转)
  5. 《D3.js数据可视化实战手册》——2.5 使用子选择器
  6. VTK:图片之ImageLaplacian
  7. 进程与线程的超级简单形象解释
  8. 添加ASP.NET网站资源文件夹
  9. 流线动态图python_Node.js Stream(流)
  10. C++小型公司管理系统
  11. java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用
  12. Opera Unite 用户指南
  13. Django如何让未登录的用户自动跳转至登录页
  14. python shell 方向键不可用
  15. android 蓝牙编程重点---如何发送和接收16进制数据
  16. IDEA如何使用SVN插件
  17. Pycharm我认为最好看,最舒服的主题配色和字体设置
  18. 将数字转换成对应的中文 将阿拉伯数字翻译成中文的大写数字
  19. 服务器怎么直接访问数据库文件路径,如何在服务器中找到数据库文件路径
  20. conda create创建虚拟环境失败

热门文章

  1. [JAVA基础类库] Objec类
  2. [ARM-assembly]-ARMV9-A64指令汇总-指令速查
  3. OPENFILENAME文件类型过滤 lpstrFilter
  4. 使用 _tprintf 宏兼容多字节字符集和Unicode字符集
  5. 【安全漏洞】一次前台任意文件下载漏洞挖掘
  6. 网络即服务(NaaS)是什么???
  7. delphi程序crackme分析1
  8. 自定义一个SharedPreferences工具类
  9. 第四章 高级数据结构
  10. 第三届传智杯全国大学生IT技能大赛(决赛B组)【c++】