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 */#include 
using 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秒