C++ 运算符重载

  通过重载运算符,程序员可以针对类类型的操作数定义不同的操作符版本,这给编程带来了极大的方便。下面给出运算符重载的要点和注意事项。

  1.C++中不能被重载的运算符共有五个:.(成员访问运算符),.*(成员指针运算符),::(作用域运算符),?:(条件运算符),sizeof(长度运算符)。

  2.重载运算符必须和用户自定义类型对象一起使用,其参数至少有一个是类对象(或者类对象的引用)。

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

  4.如果运算符左侧的操作数属于C++标准类型(如int),或者是一个其它类的类类型,则重载函数不能申明为成员函数,只能是非成员函数。如果函数要访问私有成员,则必须定义为友元函数。由于友元破坏了类的封装性,应该尽量将运算符函数作为成员函数。但是考虑各方面因素,一般将单目运算符作为成员函数,而双目运算符作为友元函数。

  5.作为类成员的重载函数,其形参看起来比操作数少一个,作为成员函数的操作符有一个隐含的this形参,限定为第一个操作符。重载一元操作符作为成员函数就没有显示形参,重载二元操作符定义为成员函数时就只有一个形参,定义为非成员函数的时候就有两个形参。

  6.使用重载操作符的方式,和内置类型操作数上使用操作符的方式一样,也可以想普通函数一样调用重载操作符函数,指定函数并传递适当的形参。假定item1和item2,是两个类对象,并重载了“+”操作符:

  item1 + item2;

  item1.operator+(item2);

这两中调用方式是等价的,都是实现两个对象的相加;

  7.重载逗号,取地址,逻辑与,逻辑或等操作符通常不是好的做法,这些操作符具有有用的内置含义,如果我们定义了自己的版本,就不能再使用这些内置含义了。

  8.某些情况下,操作符必须是成员,在另一些情况下,我们可以遵循一定的原则作出决定,下面是一些原则,有助于我们决定操作符定义为成员还是非成员:

    ·赋值(=)、下标([])、调用(())、和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定意义为非成员函数将在编译的时候产生错误。

    ·像赋值一样,复合赋值操作符通常定义为成员。与赋值不同的是,不一定非要这样做,这样做编译器不会报错。

    ·改变对象状态或与给定类型紧密联系的其它一些操作符,如自增,自检和解引用,通常应该定义为类成员。

    ·对称的操作符,如算术运算,相等操作符,关系操作符和位运算操作符,最好定义为普通成员函数。

  9.同时定义前缀式操作符和后缀式操作符存在一个问题:它们的形参数目和类型相同,普通重载没法区分是前缀式操作符还是后缀式操作符。为了解决这个问题,后缀是操作符接受一个int型形参,编译器提供0作为这个形参的实参。假设给A类定义了一个后缀式“++”操作符,代码如下:

  A A::operator++(int)

  {

    A a(*this);

    ++*this;

    return a;

  }

为了与内置操作符一致,后缀操作符应该返回旧值并且应该作为值返回,而不是引用。

原文地址:https://www.cnblogs.com/lzmfywz/p/2985649.html