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

C++参数化构造实现类聚合的动态对象数组为何输出垃圾值

问题根因与修复方案

核心错误点

  • 类B的双参数构造函数完全没有初始化内嵌的A类成员
    实现的B(int a, string b)构造逻辑,仅为B自身的成员bbb、name完成赋值,完全未处理私有内嵌成员A object。此时object会自动调用A的空实现无参构造完成初始化,由于A的无参构造没有给rool、name赋任何默认值,这两个字段存储的就是随机垃圾值。
  • create函数的赋值操作直接覆盖了之前合法初始化的实例
    main函数中最初通过单参构造B(A s)初始化obj2数组元素,这个逻辑是合法的:单参会将传入的A对象赋值给内嵌的object成员。但进入create函数后,循环执行obj2[i] = B(10, "pranjal"),调用的就是上述有缺陷的双参构造,把之前合法的B实例全部覆盖为内嵌A成员未初始化的垃圾实例。
    这匹配观察到的运行现象:create中第一次打印obj2[0].get_nn()时,拿到的还是main里初始化的正常值;循环覆盖完成后,再打印就变成了垃圾值。
  • 两个B类构造函数的参数语义完全脱节
    定义双参构造的本意,应该是通过传入的整数和字符串直接初始化内嵌的A对象,但目前实现把两个参数直接赋值给了B自身的冗余成员,和内嵌A对象没有任何关联,自然得不到预期输出。

修复方式

  1. 修正双参构造的实现逻辑,用传入的整数和字符串初始化内嵌的A对象,示例实现:
    B::B(int a, string b) {
        // 用传入参数初始化内嵌A对象
        object = A(a, b);
        bbb = a;
        name = b;
    }
    
  2. 可改用构造函数初始化列表优化效率,避免先默认构造再赋值的额外开销:
    B::B(int a, string b) : object(a, b), bbb(a), name(b) {}
    
  3. 给所有类的无参构造补充默认值初始化,避免无参创建对象时成员出现垃圾值:
    // A类无参构造修正
    A::A() : rool(0), name("") {}
    // B类无参构造修正
    B::B() : bbb(0), name(""), object(0, "") {}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 21:54:03