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

重载赋值运算符后无法将对象数组复制至第二个对象数组的问题

对象数组复制全是默认值?核心问题在这两个地方

先看你代码里最致命的错误:赋值方向完全搞反了。

你要把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:55:29