C++操作符与朋友重载

C++操作符与朋友重载,c++,operator-overloading,C++,Operator Overloading,我试图通过使用C++的参数重载来实现这一点: Complex c(3.0, 4.0); double magnitude = | c; // magnitude will be 5 我写了下面的代码:这里只有必要的部分 class Complex { public: double _real; double _imaginary; friend double operator|(const Complex &c1) {

我试图通过使用C++的参数重载来实现这一点:

Complex c(3.0, 4.0);
double magnitude = | c; // magnitude will be 5
我写了下面的代码:这里只有必要的部分

class Complex
{
   public:
       double _real;
       double _imaginary;

       friend double operator|(const Complex &c1)
       {
           return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
       }
}
但我得到了以下错误:

error C2805: binary 'operator |' has too few parameters
使用只有一个参数的运算符|是不可能的吗

使用只有一个参数的运算符|是不可能的吗

只要所涉及的类型中至少有一个是用户定义的类型,就可以重载运算符,但不能更改行为w.r.t它们可以接受多少参数。 错误消息告诉您|是一个二元运算符,您不能将其重载以充当一元运算符

正确的方法是什么

您应该为您的类复合体提供一个实用函数,适当地命名它,它将以最好的方式为您完成这项工作

请注意,运算符重载的最基本规则是: 该规则适用于像这样非直观的操作员使用

friend double operator|(const Complex &c1)
{
    return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
}
这不定义成员运算符,仅供参考

double magnitude = | c;
这是无效语法,|是二进制运算符

正确的方法:
没有额外奖励。

运算符是二进制运算符。作为二进制运算符,它需要2个参数。如果你想在这里做你想做的事情,你必须使用一元运算符

无论如何,这看起来是个坏主意,因为从操作员的角度看,看不出它在做什么

使用只有一个参数的运算符|是不可能的吗

对。运算符|是一个二进制运算符。这意味着它需要两个参数。你要找的是接线员|=

struct wtf
{
    double operator|= (double omg)
    {  
        return 42.;
    }
};

int main(){ wtf omg; omg|=  42.; }

否-“|”运算符是一个二进制运算符,这意味着它需要两个参数。可以重载运算符,但不能更改其算术。不过,有些运算符可以使用多个算术

一元运算符包括:

+ - ++前后版本 -前后版本 ! ~ * & 但是你必须定义一个合适的类型来获得双重效果 从软件工程的角度来看,最好的解决方案可能是使用一种明确的方法来获得模,例如getmodule。但是你可以合理地争辩说双重演员阵容是可以的

对于后一种情况,您需要:

class Complex
{
   public:
       double _real;
       double _imaginary;

       operator double() const
       {
           return sqrt(this._real * this._real + this._imaginary * this._imaginary);
       }
}
并按如下方式使用:

Complex c(3.0, 4.0);
double magnitude = c; // magnitude will be 5

很高兴知道投票失败的原因。运算符重载的最基本规则是,该规则适用于非直观的运算符使用,例如。可能是回答者之一,我也无缘无故地被否决了+1-1请不要。千万不要对操作员做意料之外的事情是二进制的,或者是C++的,就是这样。不是复数的数量级运算符。我不会让看到的每个运算符都过载。这就是那个人似乎在问的问题。你没有理由教训我。如果您愿意,您可以访问boost.spirit论坛,告诉人们在生成DSL时不应使用操作员过载。谢谢您的回答。我还有一个问题:在getMagnitude函数之后,const代表什么?这是否意味着该函数不能更改类中的任何内容?@zagy是的,它不能更改不可变的成员。它也只能调用其他常量方法。Downvote是一个错误,抱歉。我同意量级应该是一种属性,而不是操作符的副作用。如果你修改你的答案,我可以纠正错误。
Complex c(3.0, 4.0);
double magnitude = c; // magnitude will be 5