重载规则

  • 1、可重载的运算符

+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> <<=< code> <code>>>=</code> <code>==</code> <code>!=</code> <code><=< code> <code>>=</code> <code>&&</code> <code>||</code> <code>++</code> <code>--</code> <code>,</code> <code>->*</code> <code>-></code> <code>()</code> <code>[]</code> <code>new</code> <code>new[]</code> <code>delete</code> <code>delete[]</code><!--=<--></code><!--=<-->

  • 2、只能是成员函数重载运算符的
  • =:只有形同的类型的才可以赋值,所以 左值右值必须是同一类型。
  • ():函数调用运算符。
  • []:下标运算符。
  • ->:指针调用运算符。

  • 3、重载不能改变运算符的优先级和结合性

乘法的优先级仍然高于加法,并且它们仍然是二元运算符。

  • 4、重载不会改变运算符的用法

原有有几个操作数、操作数在左边还是在右边,这些都不会改变。例如~号右边只有一个操作数,+号总是出现在两个操作数之间,重载后也必须如此。

例如,下面这样是不对的:

int operator + (int a,int b){
    return (a-b);
}

+号原来是对两个数相加,现在企图通过重载使它的作用改为两个数相减, 如果允许这样重载的话,那么表达式 4+3的结果是 7 还是 1 呢?显然,这是绝对禁止的。

如果有两个参数,这两个参数可以都是对象,也可以一个是对象,一个是C ++内置类型的数据,例如:

complex operator+(int a, complex &c){
    return complex(a+c.real, c.imag);
}

它的作用是使一个整数和一个复数相加。

另外,将运算符重载函数作为全局函数时,一般都需要在类中将该函数声明为 友元函数。原因很简单,该函数大部分情况下都需要使用类的 private 成员。

  • 5、运算符重载函数不能有默认的参数

否则就改变了运算符操作数的个数,这显然是错误的。

  • 6、运算符重载函数既可以作为类的成员函数,也可以作为全局函数。
  • 成员函数:将运算符重载函数作为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数。之所以少一个参数,是因为这个参数是隐含的。
  • 全局函数:将运算符重载函数作为全局函数时,二元操作符就需要两个参数,一元操作符需要一个参数,而且其中必须有一个参数是对象,好让编译器区分这是程序员自定义的运算符,防止程序员修改用于内置类型的运算符的性质。

Original: https://www.cnblogs.com/burner/p/zhong-zai-gui-ze.html
Author: 浪客禅心
Title: 重载规则

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607473/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球