C++运算符重载学习总结
在C ++中,我们可以使运算符适用于用户定义的类。 这意味着C ++能够为运算符提供数据类型的特殊含义,这种能力称为运算符重载。
例如,我们可以在像String这样的类中重载运算符'+',这样我们就可以通过使用+来连接两个字符串。
其它示例中算术运算符可以重载的的类是复数,小数,大整数等。
运算符重载的语法格式:
Return_Type classname :: operator op(Argument list)
{
Function Body
}
在上面的语法中,Return_Type是要返回给另一个对象的值类型,operator op是运算符是关键字的函数,op是要重载的运算符。
运算符函数必须是非静态(成员函数)或友元函数。
运算符重载可以通过三种方法完成,它们是
1) 重载一元运算符。
2) 重载二元运算符。
3) 使用友元函数重载二元运算符。
以下是定义运算符函数的一些条件/规则:
l 在非静态函数的情况下,二元运算符应该只有一个参数,而一元不应该有一个参数。
l 在友元函数的情况下,二元运算符应该只有两个参数,而一元应该只有一个参数。
l 如果实现了运算符重载,则所有类成员对象都应该是公共的。
运算符函数和普通函数有什么区别?
运算符函数与普通函数相同。 唯一的区别是,运算符函数的名称始终是operator关键字,后跟运算符符号,并且在使用相应的运算符时调用运算符函数。
除了极个别的运算符外,大部分运算符都可以被重载。
以下是可以重载的运算符列表:
以下是不可以重载的运算符列表:
为什么(点),::,?:和sizeof不可以重载看这里解释。
关于运算符重载的重要方面:
1)为了使操作符重载起作用,其中一个操作数必须是用户定义的类对象。
2)赋值运算符:编译器自动为每个类创建一个默认赋值运算符。 默认赋值运算符确实将右侧的所有成员分配到左侧,并且在大多数情况下都能正常工作(此行为与复制构造函数相同)。
3)转换运算符:我们还可以编写可用于将一种类型转换为另一种类型的转换运算符。重载的转换运算符必须是成员方法。 其他运算符可以是成员方法或全局方法。
4)任何可以用单个参数调用的构造函数都可以用作转换构造函数,这意味着它也可以用于隐式转换为正在构造的类。
综合例子:学习测试,仅供参考!
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
#ifndef OPERATOROVERLOADINGCLASS_H
#define OPERATOROVERLOADINGCLASS_H #include <iostream> ; class OperatorOverloadingClass // 赋值运算符 // 函数调用()运算符 void print(); /* OperatorOverloading // 关系运算符 // 位运算符 // 逻辑运算符 // 取地址运算符& // 输入输出运算符 // 自增自减运算符 // 数组成员访问运算符[] // 类成员访问运算符-> // 复合赋值运算符:+=、-=、*=、/=、%=、<<=、>>=、^=、&=、|= // 重载类型转换 // new delete private: #endif // OPERATOROVERLOADINGCLASS_H |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
#include "OperatorOverloadingClass.h"
#include <QDebug> OperatorOverloadingClass::OperatorOverloadingClass() OperatorOverloadingClass::OperatorOverloadingClass(const int &number, void OperatorOverloadingClass::print() OperatorOverloadingClass OperatorOverloadingClass::operator +(const OperatorOverloadingClass &obj) OperatorOverloadingClass OperatorOverloadingClass::operator -(const OperatorOverloadingClass &obj) OperatorOverloadingClass OperatorOverloadingClass::operator *(const OperatorOverloadingClass &obj) OperatorOverloadingClass OperatorOverloadingClass::operator /(const OperatorOverloadingClass &obj) OperatorOverloadingClass OperatorOverloadingClass::operator %(const OperatorOverloadingClass &obj) OperatorOverloadingClass OperatorOverloadingClass::operator ^(const OperatorOverloadingClass &obj) OperatorOverloadingClass OperatorOverloadingClass::operator &(const OperatorOverloadingClass &obj) OperatorOverloadingClass OperatorOverloadingClass::operator |(const OperatorOverloadingClass &obj) bool OperatorOverloadingClass::operator &&(const OperatorOverloadingClass &obj) bool OperatorOverloadingClass::operator ||(const OperatorOverloadingClass &obj) bool OperatorOverloadingClass::operator <(const OperatorOverloadingClass &obj) bool OperatorOverloadingClass::operator >(const OperatorOverloadingClass &obj) bool OperatorOverloadingClass::operator <=(const OperatorOverloadingClass &obj) bool OperatorOverloadingClass::operator >=(const OperatorOverloadingClass &obj) bool OperatorOverloadingClass::operator ==(const OperatorOverloadingClass &obj) bool OperatorOverloadingClass::operator !=(const OperatorOverloadingClass &obj) // overloaded prefix ++ operator // overloaded postfix ++ operator // save the orignal value // increment this object // return old original value // overloaded prefix -- operator // overloaded postfix -- operator // save the orignal value // increment this object // return old original value void *OperatorOverloadingClass::operator new(size_t size) void OperatorOverloadingClass::operator delete(void *p) inline void *OperatorOverloadingClass::operator new[](size_t size) inline void OperatorOverloadingClass::operator delete[](void *p, size_t size) |
C++运算符重载学习总结的更多相关文章
- 初步C++运算符重载学习笔记<3> 增量递减运算符重载
初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数 增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...
- 初探C++运算符重载学习笔记<2> 重载为友元函数
初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 ...
- C++学习笔记之运算符重载
一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...
- C++学习之运算符重载的总结
C++学习之运算符重载的总结 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数 ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...
- C++基础 学习笔记五:重载之运算符重载
C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...
- 我的c++学习(8)运算符重载和友元
运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...
- C++学习26 运算符重载的概念和语法
所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...
随机推荐
- 【Spring IoC】Spring Bean(三)
一.Spring Bean的定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象. ...
- 柯里化currying + 隐式调用 = 一个有名的add面试题
柯里化 =================================== 维基百科解释: 柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参 ...
- Hbase多条件查询数据(FilterList)
利用Filter进行筛选:HBase的Scan可以通过setFilter方法添加过滤器(Filter),这也是分页.多条件查询的基础.HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBas ...
- GreenPlum 大数据平台--segment 失效问题排查
01,segment 检查一: 在master节点上检查失效的segment 正常情况下: :::: gpstate:greenplum01:gpadmin-[INFO]:-Starting gpst ...
- iptables如何安全的清空规则
使用 /sbin/iptables -F 要小心,搞不好,你就马上同服务器断开连接了 如果想清空的话,先执行 /sbin/iptables -P INPUT ACCEPT 然后执行 /sbin/ipt ...
- 在 QML 中使用 C++ 类和对象
Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ...
- wifi串口服务器
下面与大家分享上海卓岚无线wifi串口服务器ZLAN7104创建虚拟串口的设置使用心得 一.7104网线连接计算机,用ZLVircom即可搜索并配置 其中,串口设置需要匹配实际所接的串口设备,配置为相 ...
- XMLHttpRequest原生方法
时间久了,在工作中会有很多方法和见解. 随着时间的推移,慢慢的写的代码越来越多,封装分方法也越来越多,为的是方便后续工作,加快开发效率! 与此同时,我们会相应的去找一些插件,来代替我们在开发过程中执行 ...
- html 四种定位含义
技术过段时间不用的话就会忘记,需要复习一下 1.static:默认值.没有定位,元素出现在正常的流中(忽略top,bottom,left,right或者z-index声明). 2.relative:生 ...
- day06——小数据池、深浅拷贝、集合
day06 小数据池 小数据池--缓存机制(驻留机制),只是一种规格,不会实际的开辟一个空间 == 判断两边内容是否相等 ***** # a = 10 # b = 10 # print(a == b) ...