我试图更多地了解操作符重载的实际用途,以便在代码中有效地使用它们。
您能描述一下重载通常有用的一般情况吗?也许可以提供一些简单的例子?
到目前为止,我知道以下几点:
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};
}
发布于 2016-11-28 07:23:25
操作符重载只不过是函数重载。它通常在表示对象的类之间使用,为这些类定义某种代数,允许形成表达式或特定于域的子语言。
一个典型的代数对象的例子,如std::complex
见参考资料。数字,因此参与数字表达式。
另一个例子是std::vector
和std::array
,它们对基于索引的容器进行了建模,从而重载了[]
操作符。
std::valarray
向向量中添加了算法,因此它也实现了+-*/
以及许多数学函数(如sin
、cos
、tan
、sqrt
.)
另一个例子是模拟指针的std::shared_ptr
,因此它重载一元*
和->
,或者重载各种类型的迭代器来模拟集合上的指针和迭代,因此重载*
->
==
!=
++
--
+=
-=
一个特定于域的子语言的例子是用于输入/输出的std::iostream
重载<<
和>>
,或者boost::spirit
(看见),它使用操作符来形成类似EBNF的表达式。
https://stackoverflow.com/questions/40838489
复制相似问题