c++ :运算符重载函数中的细节

赋值运算符重载与拷贝构造函数

(1)区分初始化时的赋值(一般就叫初始化),和非初始化时的赋值(一般就叫赋值)
(2)实验验证初始化和赋值时各自对应

避免赋值运算符中的自赋值

(1)自赋值就是Person a; a = a;
(2)自赋值如果不处理,轻则浪费效率,重则导致内存丢失(该深拷贝时做了浅拷贝,在2.4.8中详解)
(3)避免自赋值很简单,只需要在赋值运算符重载函数所有操作前加上一个判断 if (this != &other)即可

  // 重载赋值运算符
  // Coordinate operator=(const Coordinate &other)
  // {//这样会导致重载赋值运算时会执行这个函数
  Coordinate &operator=(const Coordinate &other) {  //这样就不会
    std::cout << "  重载赋值运算符 " << std::endl;
    if (this == &other) {
      return *this;  // 处理自赋值
    }
    x = other.x;
    y = other.y;
    return *this;
  }

赋值运算符重载函数返回引用

返回引用好处1:提升程序效率
(1)赋值运算符重载函数返回值可以返回对象类型,也可以返回对象引用类型,都能工作。代码验证
(2)区别在于:返回引用可以避免一次返回值值传递的对象复制,这需要消耗资源的。代码验证
(3)总结:虽然C++语法并未强制要求,但是好的写法是应该返回引用

返回引用好处2:允许连续赋值式
(1)返回对象而不是引用时,在连续赋值(c = a = b;)时会编译可以,运行也可以,但是效率低同1中所讲。
(2)原因是先执行a=b操作,返回值再作为第2次赋值运算的右值(也就是函数参数),对象和引用是类型兼容的
(3)总结:连等在返回对象和引用时都可以,但是在返回void时就不可以了

  Coordinate &operator=(const Coordinate &other) {  //这样就不会
    std::cout << "  重载赋值运算符 " << std::endl;
    if (this == &other) {
      return *this;  // 处理自赋值
    }
    x = other.x;
    y = other.y;
    return *this;
  }
  Coordinate *operator=(const Coordinate *other) {
    std::cout << "  *other重载赋值运算符 " << std::endl;
    if (this == other) {
      return this;  // 处理自赋值
    }
    x = other->x;
    y = other->y;
    return this;
  }
  
  Coordinate a(3, 4);
  Coordinate b = a;  // 拷贝构造函数
  Coordinate c;
  c = &a;      //*other重载赋值运算符 
  c =  b;  // 重载赋值运算符
  std::cout << "a: " << a << std::endl;
  std::cout << "b: " << b << std::endl;
  std::cout << "c: " << c << std::endl;

总结

定义新变量并且使用已有变量对堆新变量进行初始化时会调用拷贝构造函数
对已经定义的变量使用已有变量进行赋值运算时会调用赋值运算符

函数返回值不同,不能构成重载
运算符重载传参的尴尬,导致引用的产生

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li星野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值