具有相同地址但值不同的对象

时间:2016-07-02 13:15:27

标签: c++ pointers reference memory-address

我正在尝试建立一个班级complex
在方法conjugate中,我希望return语句返回与局部变量res相同的对象,而不是它的副本。

#include <iostream>
#include <math.h>
using namespace std;

class complex
{
    float x, y;
    public: 
    complex(float x, float y);
    complex(float x) :complex(x, 0){}
    complex() :complex(0, 0){}
    complex(const complex &z) : complex(z.x, z.y) {}
    ~complex();

    complex &conjugate();

    friend ostream& operator<<(ostream&, const complex&);
};

ostream& operator<<(ostream& out, const complex& z){
    out << z.x << "+" << z.y << "i";
    return out;
}

complex::complex(float x, float y){
    cout << "complex number created.\n";
    this->x = x;
    this->y = y;
}

complex &complex::conjugate(){
    complex res;
    res.x = this->x;
    res.y = -this->y;
    cout << "res val: " << res << endl;
    cout << "res addr: " << &res << endl;
    return res;
}

int main(){ 
    complex a(1, 2);
    complex* c = &(a.conjugate());
    cout << "c val= " << *c << endl;
    cout << "c addr= " << c << endl;

    getchar();
    return 0;
}

输出:

complex number created.
complex number created.
res val: 1+-2i
res addr: 002CFA0C
c val: -1.07374e+008+-1.07374e+008i
c addr: 002CFA0C

*c且本地变量res具有相同的地址但价值不同。

有人可以向我解释原因吗?

2 个答案:

答案 0 :(得分:0)

您正在返回对函数作用域末尾即将销毁的局部变量的引用。这不会很好。基本上,引用是无用的,因为它引用了一个被破坏的对象并且使用它是未定义的 - 任何事情都可能发生,代码被破坏。

答案 1 :(得分:0)

res返回后

conjugate消失。你做了一个所谓的悬空参考/指针,这是程序中的一个错误。再次致电conjugate后,它会生成一个新的变量res,该变量恰好具有相同的地址,但不是相同的值。

要解决此问题,您可以将res变为static变量(static complex res;),以使其生命周期持续到函数末尾。