T **pt;
pt=new T*[10];//开创10个T* 类型大小,返回其T*[0]地址
T * pt;
pt[1]=pt; //在开创的第二个地方 的值 变为pt。 第二个地方本身没变·····
new 相当于开一块内存,对应内存的值 可以随便更改,
只要头指针指向的地方不变,那一块内存不会消失,不会被更改。
void AddCondiment(Condiment * condiment){
if(!num) {p=new Condiment *(condiment);num++;}
else{
Condiment **temp=p;//换个人接手
p=new Condiment *[++num];//重新开一个内容
for(int i=0;i<num-1;++i){
p[i]=temp[i];//p[i] 记录temp[i]存的值
}
if(num>2) //temp的值被记录了,那么开的内存可以delete了。
delete[] temp;
else delete temp;
p[num-1]=condiment;
}
}
new:重载只对第一步操作 (建立内存) //必然全局 静态,且该函数调用时 并没有对象产生,所以没有this指针,不能用对象数据!
delete:只对第三步操作 (释放内存)
假设定义类A;
T 为任意内置类型
·⒈若没有在类中重载: (T是任意类型)
系统中可以用的new有
①
1.new T 同 ::new T; //创建一个T ,T是默认值 返回其地址
2.new T(值) 同::new T(值);
3.new T[10] 同::new T(值); //创建一个T数组,T是默认值,返回其首地址
4.new T[2] { a1 } //T[1]=nullptr; 创建的同时赋值
5.new(地址) T; //在(地址)处,创建一个T
②
1. operator new(3); //开一个内存,内存大小是3个字节, 返回void*型地址
2.同::operator new(3);
·⒉若在类中有重载:重载在类A里
① 对于一切普通new A全都变成了调用类A的重载
如
1.new A();
2.new A[2]; 注: 可以new A[2]() 但不能带括号初始化。new A[2](5)是不行的
3.A::operator new(size) //相当于就直接调用那个函数 传参size 返回void*;
②调用系统
1.::new A();
2.new T;
3.::new char
4.operator new(size);
5.::operaotr new(size);
6.::new(地址) A();
注意任何与A有关的 若不加::
直接调用的是 重载的,
与A无关的可以正常用。
所以operator new(size) 不受影响