运算符重载的实际应用?

Bab*_*ham 1 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());
}
Run Code Online (Sandbox Code Playgroud)

虽然我认为现在这与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};
}
Run Code Online (Sandbox Code Playgroud)

Emi*_*lia 5

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

代数对象的典型情况作为std::complex 参考,它是......数字,因此参与数字表达式.

另一个例子是std::vectorstd::array该模型基于索引的容器中,因此过载[]操作.

std::valarray增加了算术载体,所以它也实现+-*/以及许多数学函数(如sin,cos,tan,sqrt...)

另一个例子是std::shared_ptr模拟一个指针,因此它会重载各种类型的一元*->/或迭代器,它们模拟集合上的指针和迭代,所以重载* -> == != ++ -- += -=

特定于域的子语言的一个示例是std::iostream重载<<>>输入/输出,或者boost::spirit(请参阅)使用运算符来形成类似EBNF的表达式.