You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类构造函数外使用this初始化成员?相关技术疑问

问题解答

首先看你的代码:

#include<stdio.h>
#include <iostream>
class myClass;

struct Member
{
    Member(myClass* m)
    {
        std::cout << "member is created" << std::endl;
        my_class = m;
    }
    myClass* my_class;
};

class myClass
{
public:
    myClass()
    {
        std::cout << "myClass is created" << std::endl;
    }

    Member my_member =  Member(this);
    int x = 1;
};

void test() 
{
    myClass mClass;
    std::cout << mClass.my_member.my_class->my_member.my_class->my_member.my_class->x;
}

int main()
{
    test();
}

1. 是否会导致递归构造?

不会。递归构造的触发条件是构造对象时循环触发同类/关联类的构造,但这里Member的构造函数仅接收并保存myClass的指针,没有创建任何新的myClass实例,不存在循环构造的链路,所以不会出现递归构造。

2. 代码运行正常的解释

这段代码能正常运行,关键在于两点:

  • 成员初始化顺序规则:C++中类成员的初始化顺序严格按照它们在类中的声明顺序执行,而非构造函数体的顺序。这里my_member先于x完成初始化,之后才执行myClass的构造函数体。
  • this指针的安全使用时机:初始化my_member时用的this,指向的是正在构造的myClass实例内存。此时虽然对象还没完全构造好(构造函数体未执行、x未初始化),但我们只是存储指针,没有立即访问对象成员。等到test函数中访问x时,myClass对象已经完成了所有成员初始化和构造流程,所以访问完全合法。

3. this指针何时创建并可被使用

this是类非静态成员函数(含构造函数)的隐式参数,在对象的内存空间被分配后、构造函数执行前就已经存在,指向这块已分配的内存区域。

  • 它可以在成员初始化列表(包括你用的就地成员初始化语法)中合法使用,只要不访问尚未初始化的成员即可;
  • 进入构造函数体后,this自然也能正常使用,此时可访问所有已完成初始化的成员。

内容的提问来源于stack exchange,提问作者Luci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:26:15