天纵半岛蓝湾户型图:一个C++警告,高手来看下怎么回事?

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/05 19:38:40
这个编程是我为了测试运算符+时写的,没有其它什么函数
本来用名字空间出错,现在已解决,但还是有一个警告,虽然可以运行
但我想明白哪里出错,请高手调试没错时,告诉我正确答按.还有如何
使+重载符只有一个参数,this指针可以用吗?

#include <iostream.h>
//using namespace std;//使用名字空间会出错,所以不使用

class OPE
{
public:
OPE();
void set_m(const int &t);
int & back_m(void);
friend OPE &operator+(OPE &a,OPE &b);
private:
int num,sum;

};

OPE::OPE()
{
num=sum=0;
}

void OPE::set_m(const int &t)
{
num=t;
}
int & OPE::back_m(/*不用加void也可通过编译*/)
{
return num;
}
OPE &operator+(OPE &a,OPE &b) //如何做使得只用一个参数
{
OPE t;
t.num=a.num+b.num;
return t ;
}

void main()
{
OPE a,b,s;
a.set_m(39);
b.set_m(41);

s=a+b;
cout<<"sum:\t"<<s.back_m()<<"\n";

}

下面是编译时的警告信息:
---------Configuration: A_TEST - Win32 Debug--------------------
Compiling...
Temp.cpp
E:\MATE\VC\A_TEST\Temp.cpp(33) : warning C4172: returning address of local variable or temporary

Temp.obj - 0 error(s), 0 warning(s)
一楼的,你怎么可以在我这讲这样的话,太损人了.

你的重载的+函数要求返回OPE类型的引用值,但函数实现时return的t是其局部变量,在离开函数后t就被销毁了,就有可能导致返回的值不可用。
其实直接把返回类型设为OPE就好了。

OPE &operator+(OPE &a,OPE &b) //如何做使得只用一个参数
{
OPE t;
t.num=a.num+b.num;
return t ;
}

t 为临时变量,函数结束后就被释放,所以通过return t 获取的OPE 引用就指向无效地址,这样肯定会出错。

射精最舒服啊