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

时间:2021-07-17 17:22:44
#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)
即去掉&则程序运行正确,而有了&就出错这是为什么?

9 个解决方案

#1


因为你没有定义拷贝构造函数.

#2


obj1与obj2;相加、相减、相乘、相除、的结果是临时对象
不能被绑定到非const引用参数

#3


改成下面应该就没问题了:

vector & vector:: operator=(const vector & a)

#4


#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;

}

#5


楼主是不是忘记把类定义中的对应声明改为:vector & vector:: operator=(vector a)
我在vs2008上运行没有问题

#6


原来楼主说的是没有&反而对了。。。。

其实你真正错在数组定义的下标是个变量。

#7


其实根本错误在于将临时对象传递给非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;
}

#8


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

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


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

int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[LEN],num_2[LEN];//改成这样,能用len吗?
cout<<"输入含"<<len<<"个数据的向量1:";

#9


引用 8 楼 p569354158 的回复:
居然自己没搞清楚就发上来了,

C/C++ code

int main()
{
    cout<<"输入向量的维数:";
    int len;
    cin>>len;
    int num_1[LEN],num_2[LEN];//改成这样,能用len吗?
    cout<<"输入含"<<len<<"个数据的向量1:";

C99标准才开始支持变长数组,但是在C99之前,gcc就已经就支持变长数组了

#1


因为你没有定义拷贝构造函数.

#2


obj1与obj2;相加、相减、相乘、相除、的结果是临时对象
不能被绑定到非const引用参数

#3


改成下面应该就没问题了:

vector & vector:: operator=(const vector & a)

#4


#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;

}

#5


楼主是不是忘记把类定义中的对应声明改为:vector & vector:: operator=(vector a)
我在vs2008上运行没有问题

#6


原来楼主说的是没有&反而对了。。。。

其实你真正错在数组定义的下标是个变量。

#7


其实根本错误在于将临时对象传递给非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;
}

#8


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

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


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

int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[LEN],num_2[LEN];//改成这样,能用len吗?
cout<<"输入含"<<len<<"个数据的向量1:";

#9


引用 8 楼 p569354158 的回复:
居然自己没搞清楚就发上来了,

C/C++ code

int main()
{
    cout<<"输入向量的维数:";
    int len;
    cin>>len;
    int num_1[LEN],num_2[LEN];//改成这样,能用len吗?
    cout<<"输入含"<<len<<"个数据的向量1:";

C99标准才开始支持变长数组,但是在C99之前,gcc就已经就支持变长数组了