首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

操作符重载函数,返回值的有关问题.

2012-03-09 
操作符重载函数,返回值的问题.#includeiostreamusingnamespacestdclassMatrix{public:Matrix(intmm0,i

操作符重载函数,返回值的问题.
#include   <iostream>
using   namespace   std;
class   Matrix
{
public:
Matrix(int   mm=0,int   nn=0):m(mm),n(nn),pp(NULL)   {if(n> 0&&m> 0)   pp=new   int[m*n];   }
Matrix(const   Matrix   &p);
Matrix&   operator   =(const   Matrix&   p);//=操作符重载函数
Matrix&   operator   +(const   Matrix&   p);//+操作符重载函数
void   Evaluate();//赋值
void   PrintMatrix();//打印矩阵
private:
int   *pp,m,n;
};
void   Matrix::PrintMatrix()
{
for(int   i=0;i <m;i++)
{
for(int   j=0;j <n;j++)
cout < < "   " < <pp[i*n+j] < < "   ";
cout < <endl;
}
cout < <endl;
}
void   Matrix::Evaluate()
{
for(int   i=0;i <m;i++)
for(int   j=0;j <n;j++)
pp[i*n+j]=i+j;
}
Matrix::Matrix(const   Matrix   &p):m(p.m),n(p.n)
{
pp=new   int[m*n];
for(int   i=0;i <m;i++)
for(int   j=0;j <n;j++)
pp[i*n+j]=p.pp[i*n+j];
}
Matrix&   Matrix::operator   =(const   Matrix&   p)
{
if(this==&p)
return   *this;
if(pp)
delete   []pp;
m=p.m;
n=p.n;
pp=new   int[m*n];
for(int   i=0;i <m;i++)
for(int   j=0;j <n;j++)
pp[i*n+j]=p.pp[i*n+j];
return   *this;
}
Matrix&   Matrix::operator   +(const   Matrix&   p)
{
Matrix   mp(p);
for(int   i=0;i <m;i++)
for(int   j=0;j <n;j++)
mp.pp[i*n+j]=pp[i*n+j]+p.pp[i*n+j];
return   Matrix(mp);
}
void   main()
{
Matrix   mat(3,4);
Matrix   ma1(3,4);
Matrix   ma2(3,4);
ma1.Evaluate();
ma2.Evaluate();
mat=ma1+ma2;
ma1.PrintMatrix();
ma2.PrintMatrix();
mat.PrintMatrix();
}
我想实现的是两个矩阵ma1和ma2的加法,并且把结果赋给mat,但ma1和ma2本身的值不改变.
本来加法那里,我是写return   mp;或者写return   Matrix(mp);   都出现一个警告:
returning   address   of   local   variable   or   temporary
加法做不成了.mat根本没被赋值.
后来写成这样:
Matrix&   Matrix::operator   +(const   Matrix&   p)
{
for(int   i=0;i <m;i++)
for(int   j=0;j <n;j++)
pp[i*n+j]+=p.pp[i*n+j];
return   *this;
}
结果mat和ma1一模一样了.
return   mp;我知道说的是返回一个局部变量,不可以这样.
但return   Matrix(mp);为什么也不行.
该怎么解决呢?谢谢了.
是不是因为类数据成员那里有一个指针,造成的.

[解决办法]
#include <iostream>
using namespace std;
class Matrix
{
public:
Matrix(int mm=0,int nn=0):m(mm),n(nn),pp(NULL) {if(n> 0&&m> 0) pp=new int[m*n]; }
Matrix(const Matrix &p);
Matrix& operator =(const Matrix& p);//=操作符重载函数
Matrix& operator +=(const Matrix& p);//+=操作符重载函数

//+为友员
friend Matrix operator+(const Matrix& lhs, const Matrix& rhs);

void Evaluate();//赋值
void PrintMatrix();//打印矩阵
private:
int *pp,m,n;
};
void Matrix::PrintMatrix()
{
for(int i=0;i <m;i++)
{
for(int j=0;j <n;j++)
cout < < " " < <pp[i*n+j] < < " ";
cout < <endl;
}
cout < <endl;
}
void Matrix::Evaluate()


{
for(int i=0;i <m;i++)
for(int j=0;j <n;j++)
pp[i*n+j]=i+j;
}
Matrix::Matrix(const Matrix &p):m(p.m),n(p.n)
{
pp=new int[m*n];
for(int i=0;i <m;i++)
for(int j=0;j <n;j++)
pp[i*n+j]=p.pp[i*n+j];
}
Matrix& Matrix::operator =(const Matrix& p)
{
if(this==&p)
return *this;
if(pp)
delete []pp;
m=p.m;
n=p.n;
pp=new int[m*n];
for(int i=0;i <m;i++)
for(int j=0;j <n;j++)
pp[i*n+j]=p.pp[i*n+j];
return *this;
}
Matrix& Matrix::operator +=(const Matrix& p)
{
for(int i=0;i <m;i++)
for(int j=0;j <n;j++)
pp[i*n+j]=pp[i*n+j]+p.pp[i*n+j];
return *this;
}

Matrix operator+(const Matrix& lhs, const Matrix& rhs)
{
Matrix m(lhs);
m += rhs;
return m;
}

void main()
{
Matrix mat(3,4);
Matrix ma1(3,4);
Matrix ma2(3,4);
ma1.Evaluate();
ma2.Evaluate();
mat=ma1+ma2;
ma1.PrintMatrix();
ma2.PrintMatrix();
mat.PrintMatrix();
}


[解决办法]
解决方法就是把你的+号操作符做成一个友元来实现,没有别的更好的办法

Matrix operator+(const Matrix& lhs, const Matrix& rhs)
{
Matrix mp(lhs.m,lhs.n);
for(int i=0;i <lhs.m;i++)
for(int j=0;j <lhs.n;j++)
mp.pp[i*lhs.n+j]=lhs.pp[i*lhs.n+j]+rhs.pp[i*rhs.n+j];
return mp;
}

[解决办法]
你只要改一下返回类型(去掉引用)就行了,

Matrix& operator +(const Matrix& p);

==>

Matrix operator +(const Matrix& p);

热点排行