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对象没有任何关联,自然得不到预期输出。
修复方式
- 修正双参构造的实现逻辑,用传入的整数和字符串初始化内嵌的A对象,示例实现:
B::B(int a, string b) { // 用传入参数初始化内嵌A对象 object = A(a, b); bbb = a; name = b; } - 可改用构造函数初始化列表优化效率,避免先默认构造再赋值的额外开销:
B::B(int a, string b) : object(a, b), bbb(a), name(b) {} - 给所有类的无参构造补充默认值初始化,避免无参创建对象时成员出现垃圾值:
// A类无参构造修正 A::A() : rool(0), name("") {} // B类无参构造修正 B::B() : bbb(0), name(""), object(0, "") {}
内容的提问来源于stack exchange,提问作者pranjal
相关产品推荐
相关产品推荐

