运算符重载的实际应用?

时间:2016-11-28 06:43:24

标签: c++ operator-overloading

我试图更多地了解运算符重载的实际用法,以便我可以在代码中有效地使用它们。

您能描述过载通常有用的一般情况吗?或许提供一些简短的例子?

到目前为止,我知道以下内容:

1)使用STL算法进行重载是一个常见的例子:

class Example
{
 public:
   int operator()(int i)
   {
      return i+10;
   }
};

int main()
{
   std::vector<int> V{1,2,3,4,5};
   std::transform(V.begin(), V.end(), V.begin(), Example());
}

虽然我认为现在这与lambda功能略有不同。

2)操纵对象成员:

class Example
{
 public:
   int some_variable {0};
   Example() {};
   Example(int x) : some_variable{x} {};

   Example operator+(Example &EO)
   {
      Example EO3;
      EO3.some_variable = some_variable + EO.some_variable;
      return EO3;
   }
};

int main()
{
  Example EO1(100);
  Example EO2(200);
  Example EO3 {EO1 + EO2};
}

1 个答案:

答案 0 :(得分:5)

运算符重载只不过是函数重载。它通常用于表示对象的类之间,对象可以定义某种代数,允许形成表达式或特定于域的子语言。

代数对象的典型案例为std::complex see reference,它们是......数字,因此参与数字表达式。

另一个示例是std::vectorstd::array,它为基于索引的容器建模,因此会使[]运算符超载。

std::valarray向向量添加算术,因此它还实现了+-*/以及许多数学函数(如sincostan,{{ 1}} ...)

另一个示例是sqrt模拟指针,因此它会重载一元std::shared_ptr*,或者模拟集合上的指针和迭代的各种迭代器,所以重载{ {1}} -> * -> == != ++ --

特定于域的子语言的一个示例是+=重载-=std::iostream用于输入/输出,或<<see)使用运算符形成类似EBNF的表达式。