我试图更多地了解运算符重载的实际用法,以便我可以在代码中有效地使用它们。
您能描述过载通常有用的一般情况吗?或许提供一些简短的例子?
到目前为止,我知道以下内容:
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};
}
答案 0 :(得分:5)
运算符重载只不过是函数重载。它通常用于表示对象的类之间,对象可以定义某种代数,允许形成表达式或特定于域的子语言。
代数对象的典型案例为std::complex
see reference,它们是......数字,因此参与数字表达式。
另一个示例是std::vector
和std::array
,它为基于索引的容器建模,因此会使[]
运算符超载。
std::valarray
向向量添加算术,因此它还实现了+-*/
以及许多数学函数(如sin
,cos
,tan
,{{ 1}} ...)
另一个示例是sqrt
模拟指针,因此它会重载一元std::shared_ptr
和*
,或者模拟集合上的指针和迭代的各种迭代器,所以重载{ {1}} ->
*
->
==
!=
++
--
特定于域的子语言的一个示例是+=
重载-=
和std::iostream
用于输入/输出,或<<
(see)使用运算符形成类似EBNF的表达式。