重载赋值运算符后无法将对象数组复制至第二个对象数组的问题
对象数组复制全是默认值?核心问题在这两个地方
先看你代码里最致命的错误:赋值方向完全搞反了。
你要把Tm的第1到32个元素(跳过第一个)复制到Tm2的0到31位置,但循环里写的是Tm[j] = Tm2[j-1]——这是把刚new出来、全是默认值的Tm2元素,赋值给原本有正确数据的Tm,而Tm2自始至终都没被赋值过,打印当然全是默认构造的数值。
把循环改成这样就解决了核心问题:
for (int j = 1; j < NumberOf.GetNumTeamsNFL() + 1; ++j) { Tm2[j-1] = Tm[j]; }
再看赋值运算符的问题:
你的operator=返回值是Team(值类型),这会导致每次赋值时额外拷贝一次对象,不仅效率低,也不符合C++赋值运算符的常规设计。正确的写法应该返回Team&(引用类型),同时建议给参数加const(因为赋值不会修改右值对象),再加上自赋值检查(避免对象给自己赋值时做无用功,甚至出错):
修正后的operator=:
Team& Team::operator=(const Team& Tm) { if (this == &Tm) { return *this; } Base::operator=(Tm); Position = Tm.GetPosition(); GamesPlayd = Tm.GetGamesPlayd(); wins = Tm.GetWins(); loss = Tm.GetLoss(); ties = Tm.GetTies(); DivWins = Tm.GetDivWins(); DivLoss = Tm.GetDivLoss(); DivTies = Tm.GetDivTies(); ConfWins = Tm.GetConfWins(); ConfLoss = Tm.GetConfLoss(); ConfTies = Tm.GetConfTies(); ptsscrd = Tm.GetPtsScored(); ptsalwd = Tm.GetPtsAllowd(); ofr = Tm.GetOfr(); dfr = Tm.GetDfr(); PlayOffPoints = Tm.GetPlayOffPoints(); PlayOffSeed = Tm.GetPlayOffSeed(); WLTPercentage = Tm.GetWLTPercentage(); return *this; }
补充说明:
- 自赋值检查:如果
this和传入的Tm是同一个对象,直接返回,避免重复赋值 - 参数加
const:保证赋值操作不会修改右值,同时能接受const对象的赋值请求 - 返回引用:支持链式赋值(比如
a = b = c),同时避免不必要的对象拷贝
内容的提问来源于stack exchange,提问作者Nat Broughton
相关产品推荐
相关产品推荐

