Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';实现操作员过载的最佳方法是什么? 我在C++中学到的所有东西(这都不算多),操作符重载似乎是最困难的。一般来说,何时最好将运算符重载编写为友元函数?什么时候我必须明确使用*此?使用临时对象总是不好的吗?_C++_Operator Overloading - Fatal编程技术网

什么';实现操作员过载的最佳方法是什么? 我在C++中学到的所有东西(这都不算多),操作符重载似乎是最困难的。一般来说,何时最好将运算符重载编写为友元函数?什么时候我必须明确使用*此?使用临时对象总是不好的吗?

什么';实现操作员过载的最佳方法是什么? 我在C++中学到的所有东西(这都不算多),操作符重载似乎是最困难的。一般来说,何时最好将运算符重载编写为友元函数?什么时候我必须明确使用*此?使用临时对象总是不好的吗?,c++,operator-overloading,C++,Operator Overloading,RT运算符重载并没有什么神奇之处——这种重载只是具有奇怪名称的函数。因此,编写运算符重载的方式与编写命名函数的方式相同。事实上,首先编写一个命名函数通常是一个好主意——您可以随时在以后将其更改为运算符 您唯一需要注意的是编译器使用了两个运算符: 运算符=()在集合中存储内容时 接线员尼尔的回答是正确的。此外,提供了很多关于何时、何地、为什么、以及如何使用C++中各种运算符重载的良好信息。 一般来说,我会尽量坚持使用直观的重载-“+”运算符的使用应该反映出类似于加法的东西,等等。如果您发现自己正

RT运算符重载并没有什么神奇之处——这种重载只是具有奇怪名称的函数。因此,编写运算符重载的方式与编写命名函数的方式相同。事实上,首先编写一个命名函数通常是一个好主意——您可以随时在以后将其更改为运算符

您唯一需要注意的是编译器使用了两个运算符:

  • 运算符=()在集合中存储内容时

  • 接线员尼尔的回答是正确的。此外,提供了很多关于何时、何地、为什么、以及如何使用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右值引用。

    所有运算符重载作为成员函数,将*作为左值,因此,如果您不想使用好友,则需要使用诸如>之类的重载流操作符。在大多数其他情况下,使用好友是为了打破最小特权原则。
    重载运算符的另一种方法(没有提到)是使用全局函数。

    许多库也使用运算符()处理函数对象,运算符==被其他库使用,并且。。。但我不想压倒初学者。