友元函数写法
Complex & operator++(const Complex &lhs) //前置++
Complex operator++(const Complex &lhs,int) //后置++ 注意返回值不是引用,根据语意!
+=以成员函数方式重载,+使用普通函数重载,其内部实现使用+=成员函数来实现
赋值运算符、函数调用运算符只能重载为成员函数形式
如果不重载赋值运算符,编译器会自动为每个类生成一个缺省的赋值运算符重载函数,(对象1 = 对象2),实际上是完成了由对象2各个成员到对象1相应成员的赋值,其中包括指针成员,如果对象1中含有指针成员并且牵扯到类内指针成员动态申请内存时,问题会出现,会导致内存泄漏。
new和delete运算符只能重载为类的静态运算符,重载时,无论是否显示指定static关键字,编译器内部都认为是静态的运算符重载函数。重载new时,必须返回一个void*类型的指针,可以带多个参数,但是第一个必须为size_t类型 ,该参数的值由系统确定。
static void* operate new (size_t nSize)
{
void *pSrc = new char[nSize];
return pRet;
}
调用new操作符时,首先调用operate new 申请空间,然后调用构造函数去初始化数据成员,然后再返回对象首地址
static void* operate new (size_t nSize)
{
void *pSrc = new char[nSize];//感觉不能用new ,应该malloc 等我验证一下
return pRet;
}
重载delete时,必须返回一个void*类型的指针,可以带多个参数,但是第一个必须为要释放的内存地址void*,如果有第二个参数,他必须为size_t类型。
static void* operate delete(void *pVoid)
{
delete []pVoid;//free?
}
查了查C++对象模型,p255页,里面有一句话,new运算符的实现总是以标准C malloc实现的,delete的实现总是以free实现的
可以看看这篇文章
http://blog.csdn.net/qianqin_2014/article/details/51320775
C++中的new 和delete是操作符,A * pA = new A(10)分别调用下面两步:
先调用void * operator new(size_t unSize) (调用顺序:那个有就调用那个:类中重载了就调用类的,然后全局重载,最后是C++源码中的全局函数)分配原始内存,未初始化的。里面可以调用malloc或者类似deapalloc来分配内存。
在调用A的构造函数,用初始化参数初始化。
delete pA;也分两步:
先调用A析构函数;
在调用voidoperator delete(void * pMem)(调用顺序同上面operator new),释放内存。可调用free实现或者其他实现。>> <<只能重载为友元函数