类的构造函数调用其他构造函数

本文探讨了C++中构造函数直接调用其他构造函数的问题,包括错误的调用方式和正确的实现方法,并通过示例代码展示了如何使用new(this)进行放置新建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,对于类不推荐在构造函数中调用其他构造函数。各个构造函数应该都是平行的,即都要做类的成员变量等的初始化操作。如果有时候由于各种目的不得不调用,可以有几种办法。
 
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++的类
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值