C++复习之运算符重载
发布日期:2021-07-16 18:25:48
浏览次数:3
分类:技术文章
本文共 2330 字,大约阅读时间需要 7 分钟。
运算符重载概念
- 含义:已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时产生不同的行为。
- 目的:使得C++的运算符能够用来操作对象。 不可重载的运算符(七种)
成员访问运算符 | . |
---|---|
成员指针访问运算符 | . * ,-> * |
域运算符 | :: |
长度运算符 | sizeof |
条件运算符 | ?: |
预处理运算符 | # |
-
实质:编写以运算符为名称的函数,使用运算符表达式被解释为对重载函数的使用。运算符函数格式:
返回值类型 operator运算符(形参表){函数体}
注: operator运算符,可以看作是一个整体或函数名 运算符可以重载为全局函数(通常为类的友元函数,因为全局函数不能访问类的私有成员)。对于二元运算符,需要传递两个参数。但当重载为类的成员函数时,二元运算符可以只传递一个参数。另一个参数隐含。 -
重载运算符的规则:
-
重载后运算符应该符合原来的用法习惯
-
运算符重载不能改变运算符原有的语义,包括运算符优先级和结合性。
-
不能改变运算符操作个数及语法。不能创建新的运算符,即不能超出C++语言允许重载的运算符范围
-
(),[],->或者赋值运算符=,只能重载为成员函数,不能重载为全局函数。
-
不能改变基本数据类型对象的含义。可用于用户自定义的类型对象之间的运算,也可用于用户自定义类型的对象与基本数据类型之间的混合运算。
重载赋值运算符
系统提供了默认的重载版本两个运算符:
- 赋值运算符=:系统默认重载为对象成员变量的复制
- 地址运算符&:重载为返回任何类型对象的地址。 注意: 赋值运算必须重载为成员函数不能重载为友元。 为保持与通常意义赋值运算符一致,重载赋值运算符通常所回引用。
浅拷贝:对象之间通过‘=’,没有重载时就是值的拷贝,称为浅拷贝
如果涉及到指针或引用,则它们之间是相互关联的。 可能造成的问题: 重复释放同一块空间,会产生错误。 某块内存永远不会被释放,会产生内存垃圾。深拷贝:重载运算符后,赋值语句的功能是将一个对象中指针成员变量指向的内容复制到另一个对象中指针成员变量指向的地方,这样的拷贝。
重载流插入运算符和流提取运算符(输入和输出运算符重载)
中已对<<和>>两个运算符进行了重载,用来输出C++基本的数据类型。cout是ostream类的对象,cin是istream类的对象。
自定义重载:不能是流类库的成员,而且必须重载为类的友元。 流插入重载格式:ostream &opreator<<(ostream & output,类名 &对象名){... return output;//output是ostream对象的引用,它是cout的别名}
注:插入运算符不改变对象的值,所以第二个参数 类名 &对象名或类名 对象名,两种重载方式都是可以的。
流提取重载格式:
istream &operator>>(istream &input,类名 &对象名){...return input;//同理,input是cin的别名,引用}
注:提取需要返回新的对象值,所以第二个参数只能使用引用
重载自增、自减
也有前置和后置之分。用重载的方式实现前置算法与后置算法,如下列代码:
* * @Description: * @version: * @Author: liuJun * @Date: 2021-06-27 21:55:32 * @LastEditors: Please set LastEditors * @LastEditTime: 2021-06-28 22:51:32 */#includeusing namespace std;class Cdemo { private: int n; public: Cdemo(int i = 0) : n(i) {} Cdemo &operator++(); //前置形式 Cdemo operator++(int); //后置形式 operator int() { return n; } friend Cdemo &operator--(Cdemo &); friend Cdemo operator--(Cdemo &, int);};Cdemo &Cdemo::operator++() { n++; return *this;}Cdemo Cdemo::operator++(int k) { Cdemo cmp(*this); n++; return cmp;}Cdemo &operator--(Cdemo &d) { d.n--; return d;}Cdemo operator--(Cdemo &d, int) { Cdemo tmp(d); d.n--; return tmp;}int main(int argc, char const *argv[]) { Cdemo d(10); cout << (d++) << ",";//打印d的值 10 cout << d << ",";//打印d++后的值 11 cout << (++d) << ",";//打印++d的值 12 cout << d << ",";//打印++d的值 12 cout << (d--) << ",";// 12 cout << d << ",";//11 cout << (--d) << ",";//10 cout << d << endl;//10 return 0;}
转载地址:https://blog.csdn.net/guangod/article/details/118314310 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月22日 21时58分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Unity移动应用如何在Bugly上查看崩溃堆栈
2019-04-27
unity3D 在屏幕边框创建碰撞框
2019-04-27
xml中常用的转义符
2019-04-27
关于MSDK的几个难点
2019-04-27
使用UnityEditor做工具
2019-04-27
Visual Studio我常用的快捷键
2019-04-27
写C# dll供Unity调用
2019-04-27
Linux制作run安装包
2019-04-27
一分钟学会C#解析XML
2019-04-27
unity AssetBundle的资源管理
2019-04-27
【转】Unity中HideInInspector和SerializeField一起使用
2019-04-27
单例模板类
2019-04-27
Unity与java相互调用
2019-04-27
android截屏代码
2019-04-27
unity NGUI图文混排
2019-04-27
Unity项目优化
2019-04-27
Unity3D Shader 入门
2019-04-27
MSDK手Q邀请透传参数问题:url编解码与base64编解码
2019-04-27
C#用正则表达式去匹配被双引号包起来的中文
2019-04-27