什么';实现操作员过载的最佳方法是什么? 我在C++中学到的所有东西(这都不算多),操作符重载似乎是最困难的。一般来说,何时最好将运算符重载编写为友元函数?什么时候我必须明确使用*此?使用临时对象总是不好的吗?
RT运算符重载并没有什么神奇之处——这种重载只是具有奇怪名称的函数。因此,编写运算符重载的方式与编写命名函数的方式相同。事实上,首先编写一个命名函数通常是一个好主意——您可以随时在以后将其更改为运算符 您唯一需要注意的是编译器使用了两个运算符:什么';实现操作员过载的最佳方法是什么? 我在C++中学到的所有东西(这都不算多),操作符重载似乎是最困难的。一般来说,何时最好将运算符重载编写为友元函数?什么时候我必须明确使用*此?使用临时对象总是不好的吗?,c++,operator-overloading,C++,Operator Overloading,RT运算符重载并没有什么神奇之处——这种重载只是具有奇怪名称的函数。因此,编写运算符重载的方式与编写命名函数的方式相同。事实上,首先编写一个命名函数通常是一个好主意——您可以随时在以后将其更改为运算符 您唯一需要注意的是编译器使用了两个运算符: 运算符=()在集合中存储内容时 接线员尼尔的回答是正确的。此外,提供了很多关于何时、何地、为什么、以及如何使用C++中各种运算符重载的良好信息。 一般来说,我会尽量坚持使用直观的重载-“+”运算符的使用应该反映出类似于加法的东西,等等。如果您发现自己正
- 运算符=()在集合中存储内容时
- 接线员尼尔的回答是正确的。此外,提供了很多关于何时、何地、为什么、以及如何使用C++中各种运算符重载的良好信息。
一般来说,我会尽量坚持使用直观的重载-“+”运算符的使用应该反映出类似于加法的东西,等等。如果您发现自己正在与“+”运算符或类似的东西进行字符串比较,您可能应该改用标准函数。运算符重载的第一条规则:不要重载没有意义的运算符。例如,+运算符可能看起来是将元素附加到列表中的一个不错的选择,但事实并非如此:并非每个人都认为这种用法合乎逻辑 关于数学运算符,
是不需要的 定义它们(考虑对称性和隐式转换)的典型方法如下:friend
但是,该组织不适用于struct T { T& operator+=(T const& rhs) { // the actual addition code return *this; } }; T const operator+(T const& lhs, T const& rhs) { return T(lhs) += rhs; };
或Matrix
乘法作为多项式
运算符并不是那么简单。因为 在这种情况下,我们将在*=(T const&)
的基础上定义操作符*(T const&,T const&)
,如果没有内部数据的访问器,则可以将二进制操作符*=(T const&)
设置为操作符*()
,这种使用友元
的行为不是封装冲突,而是封装强制--,或用于优化目的友元
如果您真的想消除大多数临时变量,请查看表达式模板(请参阅Blitz++、boost.ublas、newmat等),或者等待C++0x右值引用。所有运算符重载作为成员函数,将*作为左值,因此,如果您不想使用好友,则需要使用诸如>之类的重载流操作符。在大多数其他情况下,使用好友是为了打破最小特权原则。
重载运算符的另一种方法(没有提到)是使用全局函数。许多库也使用运算符()处理函数对象,运算符==被其他库使用,并且。。。但我不想压倒初学者。