目录
运算符介绍
运算符有一元运算符、二元运算符、关系运算符、逻辑运算符、按位运算符、赋值运算符等等,但这些运算符只能对内置的数据类型进行操作,比如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)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46209.html