C++之运算符重载(一元)
一、-符号重载
1.成员函数重载负号
2.友元函数重载负号
3.补充说明
<1> 《一元运算符编码实现(一)》课程笔记:
A:事实上,我们的重载运算符返回void、返回对象本身、返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值。
那么什么情况下要返回对象的引用呢?
原因有两个:1.允许进行连续赋值2.防止返回对象(返回对象也可以进行连续赋值)的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符等的效率。
对于第二点原因:如果用”值传递“的方式,虽然功能任然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。
B:用友元函数重载时,参数之所以用引用类型,也是因为原因2,为了降低开销,提高效率。
<2> 《一元运算符编码实现(二)》课程笔记:
但是看了这一节,发现后置++的返回值是对象而非引用,因为,如果返回是引用,那么返回的是一块临时变量(old)的引用,
当后置++的函数调用结束后,该临时变量会被自动释放掉,那么返回的引用的值就会是一个-37983219之类的为初始化的值了,发生bug。
二、++符号的重载
1.前置++重载
2.后置++重载
《一元运算符编码实现(二)》课程笔记:
operator定义了多个函数重载,定义了能传入一到两个参数的operator
为什么后置要传入int?
在一元operator中,运算符要放在参数前面,也就是operator++(*this),在程序中调用一元运算符的格式:
++coor,-coor
operator(int)其实是二元函数,只是第二个参数是通过隐性的方式传入参数,传入int就相当于定义了二元运算符,也就是(this*, int),
这时运算符的格式就是this*指针加运算符加int类型,再给int传入一个默认值1
例如c++1,这就满足了运算符的格式,因此在使用时变成了c++,函数会执行,而内部如何处理,就由我们随便处理。
为什么定义友元类的时候就要传入参数?
因为如果在类中定义非友元运算符(成员函数),那么默认将传入一个*this指针。
而在定义友元类,在类外定义函数,其实就是给予一个函数对该类所有对象数据的修改权限
但是这个函数默认不会传入*this指针,因为需要在参数表中传入
例如 在类的定义中定义了Coordinate& operator-()
系统默认传入了一个this指针
而在友元运算符中,因为opertor必须至少传入一个参数,因此需要传入一个coordinte对象。
C++之运算符重载(一元)的更多相关文章
- C++运算符重载——重载一元运算符
0.重载一元操作符的方法 一元运算符即只需要一个操作用的运算符,如取地址运算符(&).复数(-).自减(--).自加(++)等. 运算符重载可以分为3种方式:类的非静态成员函数.类的友元函数. ...
- 【C++知识汇总】运营商 & 运算符重载
[运算符] 在进行运算时,假设右括号的话我们知道先运算哪个,那假设没有括号了.算术运算符,关系运算符,逻辑运算符,位运算符.赋值运算符,++.--运算符等等,那么多的运算符.我们先算哪边 ...
- 探索Scala(1)-- 运算符重载
Scala语言运算符重载全然是语法层面的小把戏,本文记录我对Scala语言运算符重载的一些理解. 方法调用语法糖 调用方法时,Scala同意省略点号和圆括号,如以下代码所看到的: 把运算符映射成单词 ...
- C#编程(四十)----------运算符重载
运算符重载 所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力. 例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,sum是两个数字之和. int i=5,j=4; int ...
- VC++之运算符重载简单小结
封装继承和多态是面向对象三大基本支柱.在面向对象系统中有两种编译方式:静态联编和动态联编静态联编:也叫早期联编:指系统在编译时就决定如何实现某一动作,提供了执行速度快的优点.动态联编:也叫滞后联编:指 ...
- Swift教程之运算符重载
http://blog.csdn.net/mengxiangyue/article/details/43437797 原文地址:http://www.raywenderlich.com/80818/o ...
- c++知识点总结--友元&运算符重载
友元函数(不属于类) 可以访问类的私有变量,以及私有函数 友元函数在类内声明需要friend关键字,类外定义就不需要 友元函数可以直接在类内定义 友元函数必须包含对象指针 友元类(不适用继承,只适 ...
- 2013级别C++文章9周(春天的)工程——运算符重载(两)
课程主页中:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [程序阅读]阅读程序"简单C++学生 ...
- C++运算符重载学习总结
在C ++中,我们可以使运算符适用于用户定义的类. 这意味着C ++能够为运算符提供数据类型的特殊含义,这种能力称为运算符重载. 例如,我们可以在像String这样的类中重载运算符'+',这样我们就可 ...
- C++学习笔记-运算符重载
运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...
随机推荐
- 【LeetCode 15】三数之和
题目链接 [题解] 先把n个数字升序排个序. 然后枚举三元组最左边的那个数字是第i个数字. 之后用两个指针l,r移动来获取三元组的第2个和第3个数字. (初始值,l=i+1,r = n-1); 如果a ...
- 【Javescript】DOM(文档对象模型)
1.定义: DOM是Document Object Model文档对象模型的缩写.是针对HTML和XML文档的一个API,通过DOM可以去改变文档. 例如:我们有一段HTML,那么如何访问第二层第一个 ...
- JAVA学习之进制转换练习
public static void main(String[] args) { toBin(60); toBa(60); toHex(60); } /** 十进制-->二进制 */ publi ...
- HDU 5119 Happy Matt Friends (背包DP + 滚动数组)
题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...
- Git 学习第一天
本文是根据廖雪峰老师的git教程记录的学习笔记,特此说明,原教程链接https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...
- ThinkPHP5验证码不显示的原因及解决方法
其实很久之前刚学习tp5框架的时候就遇到了这个问题,解决完后一直没再出过问题,今天用以前的框架做新项目时又碰到了这个问题,这里记录一下 问题原因: 1.TP5本就存在这个bug 2.数据库连接不正常( ...
- 小程序onclick的写法?
bindtap="bindAction" 调用bindAction函数即可
- etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc等配置文件区别
什么是交互式shell和非交互式shell,什么是login shell 和non-login shell. 交互式模式:就是shell等待你的输入,并且执行你提交的命令.这种模式被称作交互式是因为s ...
- 因kernel too old 而 centos6.8 升级内核
因为docker运行centos 的时候,报错了,错误为kernel too old .我看了一下是因为os的内核不行了,需要升级下内核. 查看默认版本: uname -r 忘记截图了,内核大概是2. ...
- 启动eclipse出现JVM terminated. Exit code=127 错误解决办法
https://blog.csdn.net/wpzsidis/article/details/72954387 进去第二次又错