C++运算符与朋友重载

Sai*_*ait 0 c++ operator-overloading

我正在尝试使用C++使用参数重载来实现这一点:

Complex c(3.0, 4.0);
double magnitude = | c; // magnitude will be 5
Run Code Online (Sandbox Code Playgroud)

我写了下面的代码:(这里只有必要的部分..)

class Complex
{
   public:
       double _real;
       double _imaginary;

       friend double operator|(const Complex &c1)
       {
           return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
       }
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

error C2805: binary 'operator |' has too few parameters
Run Code Online (Sandbox Code Playgroud)

operator |仅使用1个参数是不可能的?

Luc*_*ore 7

friend double operator|(const Complex &c1)
{
    return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
}
Run Code Online (Sandbox Code Playgroud)

这没有定义成员运营商,只是FYI.

double magnitude = | c;
Run Code Online (Sandbox Code Playgroud)

这是无效的语法,|是一个二元运算符.

正确的方式:

class Complex
{
   public:
       double _real;
       double _imaginary;

       double getMagnitude() const // POP POP!
       {
           return sqrt(_real * _real + _imaginary * _imaginary);
       }
}
Run Code Online (Sandbox Code Playgroud)

没有更多的奖金.


Alo*_*ave 5

|仅使用1个参数就不可能使用运算符吗?

只要涉及的类型中的至少一个是用户定义的类型,您就可以重载运算符,但是您无法更改它们可以采用的参数的行为.
由于错误消息告诉您|是二元运算符,因此您不能将其重载以充当一元运算符.

这样做的正确方法是什么?

您应该为您的班级提供实用功能Complex,并对其进行适当命名,并以最佳方式为您完成工作.

请注意,操作符重载的最基本规则是:
"只要操作符的含义不明显且无可争议,就不应该重载.而是提供一个具有良好选择名称的函数."
该规则适用于非直观的操作员使用.

  • 很高兴知道downvote的原因.运算符重载的最基本规则是*[只要运算符的含义不明显且无可争议,它就不应该超载.相反,提供一个具有良好选择名称的函数.](http://stackoverflow.com/a/4421708/452307)*该规则适用于非直观的运营商使用. (2认同)