我正在尝试建立一个班级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
具有相同的地址但价值不同。
有人可以向我解释原因吗?
答案 0 :(得分:0)
您正在返回对函数作用域末尾即将销毁的局部变量的引用。这不会很好。基本上,引用是无用的,因为它引用了一个被破坏的对象并且使用它是未定义的 - 任何事情都可能发生,代码被破坏。
答案 1 :(得分:0)
res
返回后 conjugate
消失。你做了一个所谓的悬空参考/指针,这是程序中的一个错误。再次致电conjugate
后,它会生成一个新的变量res
,该变量恰好具有相同的地址,但不是相同的值。
要解决此问题,您可以将res
变为static
变量(static complex res;
),以使其生命周期持续到函数末尾。