问题描述:

Hey guys I have a problem with one of my methods (overriding an operator , ~ )

When I try to print my object, something unexpected happens... need some help

this is my whole code

#include"stdafx.h"

#include<iostream>

using namespace std;

class complex

{

private:

double Re, Im;

public:

complex(double _Re = 0, double _Im = 0) : Re(_Re), Im(_Im){} //class constructor

void print() const

{

cout << Re << " + " << "i(" << Im << ")" << endl;

}

complex operator~() const

{

return (Re, -Im);

}

};

void main()

{

complex x(2, 3);

x.print();

(~x).print();

}

If i compile it, I'll get the correct complex number on the screen, but when I try to execute the ~ overridden operator it displays to me - -3 + 0 i....

Really need some help.

Thanks

Sorry for posting such brain-dead questions, but I can't figure it out by myself....been looking at the damn code for more than 30 minutes and I can't see where I am wrong.

网友答案:

You are missing a complex(Re, -Im); in:

complex operator~() const
{
    return (Re, -Im);
}

Hence you return an implicit converted complex(-Im) (comma operator). You might use explicit constructors to avoid a pitfall like this.

网友答案:

The comma in

return (Re, -Im);

does NOT do what you think it does.

Surrounding something in parenthesis does NOT call a constructor. The parenthesis are discarded and the expression is evaluated as

return Re, -Im;

The comma means rvaluation each term and the result is the rightmost term. Because the expression Re doesn't do anything the expression is evaluated as

return -Im;

But this calls the constructor which has a default of 0 for the imaginary term. And so you get -3 for the real part and 0 for the imaginatry part.

Instead that line should read

return complex(Re, -Im);

Which constructs what you thought it should.

网友答案:
    return (Re, -Im);

This is using the comma operator, where it evaluates Re (numbers do nothing), and then evaluates and "returns" -Im (-3). Then, the return type is expected to be a complex, so it tries to convert this -3 to a complex. It finds this constructor: complex(double _Re = 0, double _Im = 0), and uses it: complex(-3, 0);

The immediate solution is to add the word complex to the return

    return complex(Re, -Im);

Or, in C++11, use {} to tell the compiler that you meant to call the constructor:

    return {Re, -Im};
网友答案:

Since you accept default values for your constructor (0) the compiler takes the expression: return (Re, -Im); evaluates Re (it is 2) throws away and creates a new complex with the -Im by calling the constructor like: complex(-3, 0). So this is how you get the funny value.

相关阅读:
Top