算子超载的实际应用?

Practical applications of operator overloading?

本文关键字:应用 超载      更新时间:2023-10-16

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

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

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

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};
}

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

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

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

std::valarray向量增加了算术,所以它也实现了+-*/以及许多数学函数(如sincostansqrt......

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

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