• C++之运算符重载


    C++运算符重载(overloading)

    1.问题需求

    为了根据自己的需要对C++已提供的运算符进行重载,赋予他们新的含义,使之一名多用。

    2.运算符重载

    运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的功能,而且能实现在函数中指定的新的功能。在使用被重载的运算符时,系统就会自动调用该函数,以实现相应的功能。

    运算符重载实质上就是函数重载。

    运算符重载的格式:

    返回值类型 operator运算符名称(形参表){重载处理};
    

    注意:

    函数名是由operator和运算符组成的
    

    eg:

    Complex operator+(const Complex &a);
    

    如何调用重载运算符:

    对象1 运算符 对象2
    eg:a+b
    

    编译器如何区分时运算符重载还是运算符的基本功能:

    编译器需要检查表达式的上下文,看运算符两侧数据的数据类型,来决定是否重载

    3.重载运算符的规则

    1.c++不允许用户自己定义新的运算符,只能对已有的运算符进行重载。

    2.c++中不允许重载的运算符

    . 成员访问运算符
    * 成员指针访问运算符
    :: 域运算符
    sizeof 长度运算符
    ?: 条件运算符

    "."和"*"不能重载是为了保证访问成员的功能不能被改变

    "::"和"sizeof"运算符的运算对象是类型而不是变量或一般表达式,不具备重载的特征。
    3.重载不能改变运算符运算对象(即操作数)的个数。

    4.重载不能改变运算符的优先级别。

    5.重载不能改变运算符的结合性。

    6.重载运算符的函数不能带有默认的参数

    7.重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或对类对象的引用) --- 参数不能全是C++的标准类型

    这样做是为了防止修改C++标准类型的运算符。
    

    8.用于类对象的运算符一般必须重载,但有两个例外,运算符"=''和"&"不必用户重载。

    1."="运算符被编译器用于对象复制的重载
    2."&"运算符也不需要重载,他被重载为返回类对象在内存中的起始地址。
    

    4.运算符重载函数的处理方式 【重点】

    1.放在类中做成员函数

    2.运算符重载的函数不是类的成员函数(可以是一个普通函数),在类中把他声明为友元函数。--- 友元重载运算函数

    友元函数和成员函数重载运算符的区别 -- 但必须得有一个对象参数

    1.友元函数参数个数就是运算符的操作数的个数,

    2.成员函数重载运算符要少一个操作数,本类对象占用一个操作数

    5.运算符重载的特别注意事项【重点规范】

    5.1 究竟把运算符重载函数作为类的成员函数好,还是友元函数好?

    1.C++规定,=,[],(),->必须作为成员函数

    2.流插入<<和流提取运算符>>、类型转换运算符不能定义为类的成员函数,只能作为友元函数

    3.一般将单目运算符和复合运算符重载为成员函数

    4.一般将双目运算符重载为友元函数

    5.2 例题:声明一个字符串类String,用来存放不定长的字符串,重载运算符"==","<",">",使他们能用于两个字符串的等于、小于和大于的比较运算 -- 重载双目运算符

    tips:双目运算符一般使用友元函数重载运算符

    5.3 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0起算。要求输出分和秒的值 --- 重载单目运算符

    tips:单目运算符一般使用成员函数重载运算符

    6.特殊的重载运算符

    6.1 ++,--运算符重载

    因为++,--分别有两种使用方法,所以要考虑前置,还是后置的问题

    关键问题:如何区分是前置自增还是后置自增?

    在自增(自减)运算符重载函数中,增加一个int型参数,用来标记后置自增(自减)运算符重载,区分前置自增(自减).

    前置自增运算符重载:

    返回值类型 operator++();
    

    后置自增运算符重载:

    返回值类型 operator++(int);
    // 注意后置单目运算,操作方法,一般是先复制一个对象,在修改调用对象,返回复制的对象
    

    6.2 重载流插入运算符和流提取运算符

    c++中的cin和cout分别是istream和ostream流的对象,<<和>>在系统中进行了重载

    "<<"重载函数格式

    ostream& operator<<(ostream &,自定义类&)
    

    ">>"重载函数格式

    istream& operator>>(istream&,自定义类&)
    

    调用方法:

    流对象<<(>>)自定义类对象;
    

    注意:

    1.重载运算符"<<"的函数的第一个参数和函数的返回类型都必须是ostream&类型对象的引用

    2.重载运算符">>"的函数的第一个参数和函数的返回类型都必须是istream&类型对象的引用

    3.ostream&一般传入的参数是cout,istream一般传入的参数为cin,然后就可以在重载函数里面使用cin和cout进行输出和输入了,只不过是指向cin和cout对象的名字变了一下而已

    4.return 流对象 的作用是

    能连续向流中输出和输入数据。
    
  • 相关阅读:
    Android按返回键退出程序但不销毁,程序后台运行,同QQ退出处理方式
    android 下动态获取控件的id
    Android大图片裁剪终极解决方案 原理分析
    如何使用Android MediaStore裁剪大图片
    最新的Android Sdk 使用Ant多渠道批量打包
    nodejs学习(1)
    C#——企业微信一般操作之一
    html(1)——转圈等待效果+鼠标移动悬浮显示相关信息
    SQL注入小结
    Java实现二叉树地遍历、求深度和叶子结点的个数
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/16535050.html
Copyright © 2020-2023  润新知