同一作用域下的同名函数,只要参数列表不同,即可重载。重载new和new[
]运算符时,函数的第1个参数是固定的,表示申请分配内存的长度。用户在不改变第1个参数的情况下,可以随意增加参数,重载多个new和new[
]运算符函数。一个比较实际的例子就是重载定位的new和new[ ]运算符,即为new和new[ ]重载函数增加1个指针类型的参数,new和new[
]表达式调用时,返回该指针指定位置的内存地址。
1 //程序示例
2
#include"malloc.h"
3
#include<iostream>
4
using std::cout;
5
using std::endl;
6
7
class Point
8
{
9
public:
10
double x,y;
11
Point(double x1,double y1):x(x1),y(y1)
12
{
13
printf("1个Point对象被创建/n");
14
}
15
~Point()
16
{
17
x=y=0;
18
printf("1个Point对象被释放/n");
19
}
20
void* operator new(size_t, double* p)
21
{
22
return p;
23
}
24
void operator delete (void* ,double*)
25
{}
26
};
27
28
void print(double * d,int n)
29
{
30
for(int i=0;i<n;++i)
31
cout<<d[i]<<" ";
32
cout<<endl;
33
}
34
int main()
35
{
36
double d[6]={1.1,1.2,1.3,1.4,1.5,1.6};
37
print(d,6);
38
39
Point* p=new(d+2) Point(100,100);
40
print(d,6);
41
42
p->Point::~Point();
43
print(d,6);
44
45
return 0;
46
}
显示结果:
1.1
1.2 1.3 1.4
1.5 1.6
1个Point对象被创建
1.1
1.2 100 100
1.5 1.6
1个Point对象被释放
1.1
1.2 0 0
1.5 1.6
当定位new运算符是在已经分配好的内存上进行二次分配时,为了避免同一块内存被释放多次,所以,最好不要使用delete表达式释放定位的new运算符所分配的内存。对于本例来说,数组d的内存来自于栈,main函数结束时将自动释放,如果在程序中使用类似delete
p这样的表达式,必然引起程序出现错误。那么,为了在不使用delete表达式的情况下,也能够调用Point对象析构函数,我们可以向第42行代码那样进行析构函数的显示调用。