首先,对于类不推荐在构造函数中调用其他构造函数。各个构造函数应该都是平行的,即都要做类的成员变量等的初始化操作。如果有时候由于各种目的不得不调用,可以有几种办法。
class CTestCon
{
public:
CTestCon(int n) {}
CTestCon()
{
// 错误调用方式1
//CTestCon::CTestCon(10);
// 错误调用方式2
//CTestCon(10);
// 正确调用方法1
//this->CTestCon::CTestCon(10);
// 正确调用方法 2
//new(this)CTestCon(10);
}
};
测试代码为
CTestCon oCon;
关于 new(this)原理,在new.h文件总有一段相关代码
#ifndef
__PLACEMENT_NEW_INLINE
#define
__PLACEMENT_NEW_INLINE
inline
void *__CRTDECL
operator new(size_t,
void *_Where)
{return (_Where); }
#if
_MSC_VER >= 1200
inline
void __CRTDECL
operator delete(void *,
void *)
{return; }
#endif
#endif
两种错误调用方法一定要注意,他们都是会临时构建一个类的实例的临时变量,所有的修改都在这个临时变量上。
一般系统函数都是由编译器自动调用的(是编译器吧?),一个典型的必须自己调用的场景为:
class CTestCon
{
public:
CTestCon()
{
m_pValues =
new int[2];
m_pValues[0] = 10;
m_pValues[1] = 20;
}
~CTestCon()
{
delete []m_pValues;
m_pValues = NULL;
}
int GetValue(int nIdx)
{
return m_pValues[nIdx];
}
protected:
int *m_pValues;
};
调用:
BYTE *pBuffer = (BYTE*)malloc(sizeof(CTestCon));
//((CTestCon*)pBuffer)->CTestCon::CTestCon(); // 正常工作
new(pBuffer)CTestCon();
// 正常工作
int nValue = ((CTestCon*)pBuffer)->GetValue(0);
//((CTestCon*)pBuffer)->CTestCon::~CTestCon(); // 正常工作
((CTestCon*)pBuffer)->~CTestCon();
// 正常工作
free(pBuffer);
这是什么场景呢?
我要用malloc,realloc等c的分配内存函数来支持c++的类