当前位置: 首页 > news >正文

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;

总结

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

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • jmeter-beanshell学习9-放弃beanshell
  • k8s快速部署一个网站
  • tkinter-TinUI-xml实战(11)多功能TinUIxml编辑器
  • 【python学习】python标准库之正则表达式库re的定义、功能和函数,以及正则表达式的元字符和含义
  • 【深度学习入门篇 ②】Pytorch完成线性回归!
  • Ubuntu实战续篇:Apache httpd轻松搭建高效代理服务器
  • Spring AOP 实现 Excel 导出统一处理
  • Linux——公网 IP别名设置,清屏,删除别名,在linux中提供alias永久化的方法,命令历史
  • 【Superset】dashboard 自定义URL
  • ESP32CAM物联网教学11
  • 微服务中的 “服务发现机制” 简介
  • 链接追踪系列-07.logstash安装json_lines插件
  • Redis① —— Redis基础
  • 数据分析_计划
  • 金蝶云苍穹-插件开发(四)GPT开发相关插件
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Akka系列(七):Actor持久化之Akka persistence
  • echarts的各种常用效果展示
  • es的写入过程
  • express.js的介绍及使用
  • IDEA 插件开发入门教程
  • JSDuck 与 AngularJS 融合技巧
  • Kibana配置logstash,报表一体化
  • nginx 负载服务器优化
  • swift基础之_对象 实例方法 对象方法。
  • use Google search engine
  • Vue2 SSR 的优化之旅
  • 基于webpack 的 vue 多页架构
  • 利用jquery编写加法运算验证码
  • 批量截取pdf文件
  • 提醒我喝水chrome插件开发指南
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #laravel 通过手动安装依赖PHPExcel#
  • #NOIP 2014# day.1 T2 联合权值
  • #WEB前端(HTML属性)
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (+4)2.2UML建模图
  • (11)MATLAB PCA+SVM 人脸识别
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)LINQ之路
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ******之网络***——物理***
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net core Swagger 过滤部分Api
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 快速重构概要1
  • .Net 垃圾回收机制原理(二)
  • .Net 知识杂记
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net后端程序发布到nignx上,通过nginx访问