对于new的重载,首先我们要了解new的作用以及格式。
“C++中new运算符用于动态分配和bai撤销内存的运算符。 new运算符使用的一般格式为new 类型 [初值]。 用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL。
作 用: 和malloc相似,在堆区申请内存空间。
格 式: 指针变量 = new 类型 开辟一个类型空间,不会初始化。
指针变量 = new 类型(初始值) 开辟一个内存空间,会初始化成初始值。
指针变量 = new 类型[数组大小] 开辟数组大小个内存空间,不会初始化。
new操作符的重载
格式:void* operator new(size_t size,int a )//这里我函数中用的new所以有两个参数,如果用malloc请去掉a。
下面我们来看一下代码。
#include <iostream>
#include <cstring>
using namespace std;
class boss
{
public:
int x;
int y;
char* name;
void show(boss& aaa)
{
cout<<aaa.name<<endl;
cout<<aaa.x<<" "<<aaa.y<<endl;
}
friend void* operator new(size_t size);
friend ostream& operator<< (ostream& aa,boss& aaa);//重载<<
boss* operator ->()// 重载->
{
return this;
}
boss(int a,char *b)
{
x=a;
name=new char[20];\
strcpy(name,b);
}
boss():x(0),y(0){}
~boss(){}
};
定义一个类,用来放重载函数,因为在外部函数中要调用掉类中的数据,所以我们运用了友元,将友元函数放到类中。并且我们这里重载了输出流"<<",这里要注意的是输出流的类型为ostream,当然你不用重载"<<"也是可以的。这里还重载了'->'这个重载大致和输出流一样。
因为name为char类型 我们在构造函数中给予他空间,当然你也可以用:x(a)的形式,但是name不可以,他需要开空间。
void* operator new(size_t size,int a )
{
void *p =new boss;
return p;
}
ostream& operator<< (ostream& aa,boss& aaa) //重载<<
{
aa<<aaa.x<<" "<<aaa.y<<" "<<aaa.name;
return aa;
}
int main()
{
boss* aaa=new (20)boss;
aaa->name="aaa";
aaa->x=100;
aaa->y=111;
cout<<aaa->x<<aaa->name<<endl;
return 0;
}
上图是new以及输出流<<的重载,主函数中因为我们的new的重载函数中返回的是boss类型的指针,所以我们也要用相同类型的指针来接收它。在主函数中我们可以直接用aaa->="aaa";的这种形式是因为我们重载了"->",如果不进行重载通过传入对象的方式也能进行name的赋值。