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)
运算符重载只不过是函数重载.它通常用于表示对象的类之间,可以定义某种代数,允许形成表达式或特定于域的子语言.
代数对象的典型情况作为std::complex 参考,它是......数字,因此参与数字表达式.
另一个例子是std::vector与std::array该模型基于索引的容器中,因此过载[]操作.
std::valarray增加了算术载体,所以它也实现+-*/以及许多数学函数(如sin,cos,tan,sqrt...)
另一个例子是std::shared_ptr模拟一个指针,因此它会重载各种类型的一元*和->/或迭代器,它们模拟集合上的指针和迭代,所以重载* -> == != ++ -- += -=
特定于域的子语言的一个示例是std::iostream重载<<和>>输入/输出,或者boost::spirit(请参阅)使用运算符来形成类似EBNF的表达式.