operator new/delete,operator-> / *【C++运算符重载】
- 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++运算符重载】相关推荐
- c++运算符重载总结
c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁.高效.在c++中不止函数可以重载,运算符也可以重载.由于一般数据类型间的运算符没有重载的必要, ...
- 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )
文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...
- c 运算符重载总结
目录 1.一般运算符重载 2.关系运算符重载 3.逻辑运算符重载 4.单目运算符重载 5.自增减运算符重载 6.位运算符重载 7.赋值运算符重载 8.内存运算符重载 9.特殊运算符重载 10.总结 c ...
- 运算符重载(加减运算符、前置加加(减减)后置加加(减减)运算符、赋值运算符、输入输出运算符、关系运算符、函数调用)
编译器对于一个类会默认生成以几种函数: 1.默认构造函数(空形参,空函数体) 2.默认拷贝构造函数(浅拷贝,也叫值拷贝.字节拷贝) 3.析构函数(空形参,空函数体.析构函数要求形参列表必须是空的,所以 ...
- C++学习笔记:(四)运算符重载 类型转换
目录 6.运算符重载 6.1运算符重载的基本概念 6.2成员函数重载运算符 6.3友元函数重载运算符 6.4成员函数重载运算符和友元函数重载运算符比较 6.5类型转换 6.运算符重载 面向对象程序设计 ...
- 运算符重载的基本规则和习语是什么?
问: 注意:答案是按特定顺序给出的,但是由于许多用户根据投票而不是给出的时间对答案进行排序,所以这里是一个按最有意义的顺序排列的答案索引: C++中运算符重载的一般语法 C++中运算符重载的三个基本规 ...
- C++运算符重载详解
目录 什么是运算符重载 运算符重载的意义 运算符重载的语法格式 简单例子 "+"运算符的重载 代码分析 运算符重载的两种方式 1,重载为类的成员函数 (1),双目运算符 (2),单 ...
- C++中的运算符重载
1.Cpp中的重载运算符和重载函数 C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但 ...
- C++中运算符重载的方法
**#include<iostream> using namespace std; class Complex{ public:Complex(){real=0;imag=0;}Compl ...
- 【C++】C++类的学习(三)——运算符重载与友元函数
[fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前面的两篇博文中介绍了类的一些基本特性,今天讲一讲运算符重载和友元. 运算符重载 运算 ...
最新文章
- centos 7 部署k8s集群
- fatal error LNK1181: 无法打开输入文件“libx264.lib”
- Windows驱动开发学习笔记(七)—— 多核同步内核重载
- 4.1 基础-放苹果(整数划分)
- 自由自在意式手工冰淇淋的清凉之风已“冰”临城下
- python不支持_为什么 Python 不支持函数重载?而其他语言大都支持?
- K3CLOUD数据权限授权
- 人类为啥比小鼠发育更慢?同日两篇《科学》找到意想不到的原因
- 自定义调试窗口---上面板
- java输入奇数得菱形_输入行数,打印菱形
- Python入门--列表元素的修改
- 二叉树遍历算法的应用——复制二叉树
- GPS 射频调试总结
- ORACLE 提取汉字拼音首字母及汉字排序
- 电气防火限流式保护器及其过电流故障检测方法
- C/C++外部链接、内部链接
- JAVA 生成二维码 并设置 +失效机制
- C#把月日年帶有 AM、PM的时间格式转换为正常时间格式
- CSP201609-3(炉石传说)(Java 100分)(只有78行代码)
- 中国移动:流量不限。有下文了。
热门文章
- 栈——用链表实现栈操作
- Django + Uwsgi + Nginx 的生产环境部署
- 与mysql的零距离接触_与MySQL的零距离接触
- 薪资那么高的Web前端的工作者,想要提高薪资就必须看的书单
- 1.6 去除字符串中的空格(trim())
- 3.2.4 页面分配策略
- 2.3.11 管程
- java动态执行逻辑_动态执行代码逻辑
- python自动化测试视频教程_精品系列-悠悠Python自动化测试学习视频,资源教程下载...
- 计算机网络教室课程安排表,关于计算机教学计划汇总六篇