运算符重载的参数引用问题

angle_xiaoqing 2010-11-21 09:46:26
#include"iostream"
#include"iomanip" //控制格式
using namespace std;

const int MAX = 20;
class vector
{
public:
vector(int n){length=n;}
vector(int num[],int n);

friend vector operator + (vector &a,vector &b);
friend vector operator - (vector &a,vector &b);
friend vector operator * (vector &a,vector &b);
vector & operator = (vector & a);
void display();
private:
int X[ MAX ];
int length;

};
vector::vector( int num[],int n)
{
int i;
for(i=0;i<n;i++)
{
X[i]= num[i];
}
length=n;
}
vector operator+(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]=a.X[i]+b.X[i];
}
return temp;
}
vector operator-(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]= a.X[i]-b.X[i];
}
return temp;
}
vector operator*(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i] = a.X[i] * b.X[i];
}
return temp;
}
vector & vector:: operator=(vector & a)
{

length=a.length;
for(int i=0;i<a.length;i++)
{
X[i]=a.X[i];
}
return *this;
}
void vector::display()
{
for(int i=0;i<length;i++)
{
cout<<setw(4)<<X[i];
}
cout<<endl;
}
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[len],num_2[len];
cout<<"输入含"<<len<<"个数据的向量1:";
int j=0;
while(j<len)
{
cin>>num_1[j];
j++;
}
cout<<"输入含"<<len<<"个数据的向量2:";
int i=0;
while(i<len)
{
cin>>num_2[i];
i++;
}

vector obj1(num_1,len), obj2(num_2,len),obj3(len);

cout<<"************************************************\n"
<<"向量1: ";
obj1.display();

cout<<"向量2: ";
obj2.display();
cout<<"操作:";
char op;
cin>>op;
cout<<endl;


switch(op)
{
case '+' : obj3= obj1+obj2;
break;

case '-' : obj3 = obj1-obj2;
break;

case '*' : obj3 = obj1*obj2;
break;
case '=' : obj3 = obj2; //=>obj3.operator=(obj1)
break;

}
obj3.display();
cout<<"************************************************\n";
system("pause");
return 0;

}
在这个程序中只要将
vector & vector:: operator=(vector & a)
{

length=a.length;
for(int i=0;i<a.length;i++)
{
X[i]=a.X[i];
}
return *this;
}
中的参数改为vector & vector:: operator=(vector a)
即去掉&则程序运行正确,而有了&就出错这是为什么?
...全文
216 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lucky-lucky 2010-11-21
  • 打赏
  • 举报
回复





居然自己没搞清楚就发上来了,

int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[LEN],num_2[LEN];//改成这样,能用len吗?
cout<<"输入含"<<len<<"个数据的向量1:";
we_sky2008 2010-11-21
  • 打赏
  • 举报
回复
其实根本错误在于将临时对象传递给非const引用参数,同样道理,楼主重载的+ - *运算符也隐藏着同样的问题,比如说,obj1 + obj2 + obj3;这样的表达式就不能通过编译,同样是因为从在重载的运算符参数是非const引用参数。
解决方法很简单,只需要将重载的运算符参数修改为const vector &即可,
另外,对于这个例子,重载operator=是没有必要的,在用到vector赋值时编译器会自动生成一个vector &operator=(const vector &)函数,其功能和楼主自定义的完全一样,只是编译器生成的函数效率更高。


#include<iostream>
#include<iomanip>//控制格式

using namespace std;

const int MAX = 20;
class vector
{
public:
vector(int n){length = n;}
vector(int num[], int n);

//这里参数都设置为const引用
friend vector operator + (const vector &a, const vector &b);
friend vector operator - (const vector &a, const vector &b);
friend vector operator * (const vector &a, const vector &b);
//vector & operator = (const vector & a);/重载operator=不是必须的!

void display();
private:
int X[ MAX ];
int length;
};
vector::vector(int num[], int n)
{
int i;
for(i=0; i<n; i++)
{
X[i]= num[i];
}
length=n;
}
vector operator+(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] + b.X[i];
}
return temp;
}
vector operator-(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] - b.X[i];
}
return temp;
}
vector operator*(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] * b.X[i];
}
return temp;
}
/*
vector & vector:: operator=(const vector & a)
{
length=a.length;
for(int i=0; i<a.length; i++)
{
X[i] = a.X[i];
}
return *this;
}*/
void vector::display()
{
for(int i=0; i<length; i++)
{
cout<<setw(4)<<X[i];
}
cout<<endl;
}
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[len], num_2[len];
cout<<"输入含"<<len<<"个数据的向量1:";
int j = 0;
while(j < len)
{
cin>>num_1[j];
j++;
}
cout<<"输入含"<<len<<"个数据的向量2:";
int i = 0;
while(i < len)
{
cin>>num_2[i];
i++;
}

vector obj1(num_1,len), obj2(num_2,len), obj3(len);

cout<<"************************************************\n"
<<"向量1: ";
obj1.display();

cout<<"向量2: ";
obj2.display();
cout<<"操作:";
char op;
cin>>op;
cout<<endl;

switch(op)
{
case '+' : obj3 = obj1 + obj2;
break;

case '-' : obj3 = obj1 - obj2;
break;

case '*' : obj3 = obj1 * obj2;
break;
case '=' : obj3 = obj2; //=>obj3.operator=(obj1)
break;
}

obj3.display();
cout<<"************************************************\n";
system("pause");
return 0;
}

qq120848369 2010-11-21
  • 打赏
  • 举报
回复
原来楼主说的是没有&反而对了。。。。

其实你真正错在数组定义的下标是个变量。
rtygbwwwerr 2010-11-21
  • 打赏
  • 举报
回复
楼主是不是忘记把类定义中的对应声明改为:vector & vector:: operator=(vector a)
我在vs2008上运行没有问题
qq120848369 2010-11-21
  • 打赏
  • 举报
回复
#include"iostream" 
#include"iomanip" //控制格式
using namespace std;

const int MAX = 20;
class vector
{
public:
vector(int n){length=n;}
vector(int num[],int n);
vector(const vector &obj)
:length(obj.length)
{
for(int i=0;i!=MAX;++i)
{
X[i]=obj.X[i];
}
}

friend vector operator + (vector &a,vector &b);
friend vector operator - (vector &a,vector &b);
friend vector operator * (vector &a,vector &b);
vector & operator = ( vector a); //mark,可以运行了,但是不要这样写
void display();
private:
int X[ MAX ];
int length;

};
vector::vector( int num[],int n)
{
int i;
for(i=0;i<n;i++)
{
X[i]= num[i];
}
length=n;
}
vector operator+(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]=a.X[i]+b.X[i];
}
return temp;
}
vector operator-(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]= a.X[i]-b.X[i];
}
return temp;
}
vector operator*(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i] = a.X[i] * b.X[i];
}
return temp;
}
vector & vector:: operator=(vector a) //mark,使用const &
//改为你的vector a也正常运行了
{

length=a.length;
for(int i=0;i<a.length;i++)
{
X[i]=a.X[i];
}
return *this;
}
void vector::display()
{
for(int i=0;i<length;i++)
{
cout<<setw(4)<<X[i];
}
cout<<endl;
}
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[100],num_2[100]; //mark:数组不能用变量
cout<<"输入含"<<len<<"个数据的向量1:";
int j=0;
while(j<len)
{
cin>>num_1[j];
j++;
}
cout<<"输入含"<<len<<"个数据的向量2:";
int i=0;
while(i<len)
{
cin>>num_2[i];
i++;
}

vector obj1(num_1,len), obj2(num_2,len),obj3(len);

cout<<"************************************************\n"
<<"向量1: ";
obj1.display();

cout<<"向量2: ";
obj2.display();
cout<<"操作:";
char op;
cin>>op;
cout<<endl;


switch(op)
{
case '+' : obj3= obj1+obj2;
break;

case '-' : obj3 = obj1-obj2;
break;

case '*' : obj3 = obj1*obj2;
break;
case '=' : obj3 = obj2; //=>obj3.operator=(obj1)
break;

}
obj3.display();
cout<<"************************************************\n";
system("pause");
return 0;

}
we_sky2008 2010-11-21
  • 打赏
  • 举报
回复
改成下面应该就没问题了:

vector & vector:: operator=(const vector & a)
we_sky2008 2010-11-21
  • 打赏
  • 举报
回复
obj1与obj2;相加、相减、相乘、相除、的结果是临时对象
不能被绑定到非const引用参数
qq120848369 2010-11-21
  • 打赏
  • 举报
回复
因为你没有定义拷贝构造函数.
we_sky2008 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 p569354158 的回复:]
居然自己没搞清楚就发上来了,

C/C++ code

int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[LEN],num_2[LEN];//改成这样,能用len吗?
cout<<"输入含"<<len<<"个数据的向量1:";
[/Quote]
C99标准才开始支持变长数组,但是在C99之前,gcc就已经就支持变长数组了

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧