瑰月 2022-06-12 14:58 采纳率: 100%
浏览 18
已结题

关于c++运算符重载疑问

visual studio 2019版本,c++20

类文件

class Average {
    int sum;
    int n;

public:
    Average(int x=0,int y=0):sum(x),n(y) {};
    friend Average operator+(Average &avg1, Average &avg2);//重载加法
    friend std::ostream& operator<<(std::ostream &out,Average &avg);//重载输出符号<<
    Average(const Average& copy) :sum(copy.sum), n(copy.n) {
        cout << "调用赋值构造函数"<<endl;
    }
    Average operator+=(int x) {
        sum += x;
        n++;
        return *this;
    }
};

Average operator+(Average& avg1, Average& avg2) {
    return { avg1.sum + avg2.sum,avg1.n + avg2.n };//返回时自动初始化
}

std::ostream& operator<<(std::ostream& out, Average& avg) {
    out<< static_cast<float>(avg.sum) / static_cast<float>(avg.n);
    return out;
}

主函数


int main(int argc, char* argv[]) {
    Average avg{};

    avg += 4;
    std::cout << avg << '\n'; // 4 / 1 = 4

    avg += 8;
    std::cout << avg << '\n'; 

    avg += 24;
    std::cout << avg << '\n'; 

    avg += -10;
    std::cout << avg << '\n';

    (avg += 6) += 10; // 2 calls chained together
    std::cout << avg << '\n'; 

    Average copy{ avg };
    std::cout << copy << '\n';

    return 0;
}

运行结果

调用赋值构造函数
4
调用赋值构造函数
6
调用赋值构造函数
12
调用赋值构造函数
6.5
调用赋值构造函数
调用赋值构造函数
6.4(这里结果应该是7)
调用赋值构造函数
6.4

调试

调试时候发现连续两个+=号过程中没有出错,但是后面一个*this的值没有返回

img

img

后面两个为7

  • 写回答

1条回答 默认 最新

  • 假装不困 2022-06-12 17:53
    关注

    核心:代码其实走了默认生成的拷贝构造函数,由于都是基本类型 int 之类的数据,正常运行

    如有帮助,望点击我回答右上角【采纳】按钮支持一下

    你的代码里面,连续两次调用,第二次调用其实也变化了,只是变化的那个是临时变量,不是你的对象本身

    改动如下,你返回 引用 即可确保每次改动对象本身

        Average& operator+=(int x)
        {
            sum += x;
            n++;
            return *this;
        }
    

    img

    #include <iostream>
    
    using namespace std;
    
    class Average {
        int sum;
        int n;
    
    public:
        Average(int x = 0, int y = 0) :sum(x), n(y) {};
    
        friend Average operator+(Average& avg1, Average& avg2)
        {
            return { avg1.sum + avg2.sum,avg1.n + avg2.n };//返回时自动初始化
        }
    
        friend std::ostream& operator<<(std::ostream& out, Average& avg)
        {
            out << static_cast<float>(avg.sum) / static_cast<float>(avg.n);
            return out;
        }
    
        Average(const Average& copy) :sum(copy.sum), n(copy.n)
        {
            cout << "调用赋值构造函数" << endl;
        }
    
        Average& operator+=(int x)
        {
            sum += x;
            n++;
            return *this;
        }
    };
    
    
    int main(int argc, char* argv[]) 
    {
        Average avg{};
    
        avg += 4;
        std::cout << avg << '\n'; // 4 / 1 = 4
    
        avg += 8;
        std::cout << avg << '\n';
    
        avg += 24;
        std::cout << avg << '\n';
    
        avg += -10;
        std::cout << avg << '\n';
    
        (avg += 6) += 10; // 2 calls chained together
        std::cout << avg << '\n';
    
        Average copy{ avg };
        std::cout << copy << '\n';
    
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 已采纳回答 6月12日
  • 创建了问题 6月12日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效