C++重载运算符

友元函数写法

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

调用delete操作符是,先调用析构函数,然后调用operate delete进行销毁。


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实现或者其他实现。

>> <<只能重载为友元函数



你可能感兴趣的:(C++)