运算符重载

导读:本篇文章讲解 运算符重载,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

运算符介绍

运算符重载规则

参考


运算符介绍

运算符有一元运算符、二元运算符、关系运算符、逻辑运算符、按位运算符、赋值运算符等等,但这些运算符只能对内置的数据类型进行操作,比如int、double等。对于类类型的变量,这些运算符不能直接使用,需要重载才能使用,就是运算符重载。

运算符重载的一般形式:

返回值类型 operator运算符(参数列表);

比如,在类CBox中重载”+”,那么写为:      

CBox operator+(const CBox &b)
{
    //在函数体内实现相应的操作。
}

运算符重载也可以发生在类外,如下:

class CBox
{
public:
    // 其它操作
    friend CBox operator-(const CBox& a, const CBox& b);
private:
    int m_iHeight;
    int m_iLength;
    int m_iWidth;
};
CBox operator-(const CBox &a,const CBox &b)
{
    CBox ret;
    ret.m_iWidth = a.m_iWidth - b.m_iWidth;
    ret.m_iHeight = a.m_iHeight - b.m_iHeight;
    ret.m_iLength = a.m_iLength - b.m_iLength;
    return ret;
}

什么时候选择声明为成员函数或非成员函数:

  • 一般,单目运算符重载为成员函数,双目运算符重载为友元函数;
  • 双目运算符不能将=、()、[]、->重载为非成员函数;
  • 如果运算符的第一次操作数要求为隐式转换则必须为非成员函数;
  • 当最左边的要求为类对象,右边是一个内置类型,要声明为非成员函数。

运算符重载规则

1. 不是所有的运算符都可以重载;

需要注意的是并非所有的运算符都可以实现重载!!!

可重载的运算符如下:

运算符类型

运算符

双目运算符

+、-、*、/、%;加、减、乘、除、取模

关系运算符

==、!=、<、>、<=、>=

逻辑运算符

||、&&、!;逻辑或、逻辑与、逻辑非

单目运算符

+、-、*、&;正、负、指针、取地址

自增自减运算符

++、–

位运算符

|、&、~、^、<<、>>;按位或、按位与、按位取反、按位异或、左移、右移

赋值运算符

=、+=、-=、*=、/=、%=、|=、^=、&=、<<=、>>=

空间申请与释放

new、delete、new[]、delete[]

其它运算符

()、->、,、[];函数调用、成员访问、逗号、下标

不可重载的运算符列表有:

  • . :成员访问运算符;
  • .*、->* :成员指针访问运算符;
  • :: :域运算符;
  • sizeof :长度运算符;
  • ?: :条件运算符;
  • # :预处理符号;

2. 重载不能改变运算符的优先级和结合性.

3. 重载不要改变运算符的用法。

4. 运算符重载函数不能又默认的参数,否则就改变了运算符操作数的个数。

5. 运算符重载函数既可以作为类的成员函数,也可以作为全局函数。

       作为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数;

       作为全局函数时,需要在该类中声明为友元函数,二元运算符需要两个参数,一元运算符必须又一个参数

6. 成员访问【->】、下标运算符【[]】、函数调用运算符【()】、赋值运算符【=】总股本不过以成员函数的形式重载。

7. 重载前++和后++的方式:前++不带参数,后++带一个int型参数加以区分。

参考

1. C++ 重载运算符和重载函数 | 菜鸟教程 (runoob.com)

2. https://blog.csdn.net/lishuzhai/article/details/50781753

3.  http://c.biancheng.net/cplus/operator/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46209.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!