同一作用域下的同名函数,只要参数列表不同,即可重载。重载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行代码那样进行析构函数的显示调用。