运算符重载小问题,头痛一晚上了

时间:2021-02-12 17:38:46
[code=C/C++]
#include <iostream>
using namespace std;

class Sales_item
{
      string isbn;       //条形码 
      int num;           //数量
      double price;      //价格    
      public:
             
             Sales_item ():isbn(""),num(0), price(0){}
             
             Sales_item (string str, int ival, double dprice):isbn(str), num(ival), price(dprice){}
                        
             
             Sales_item (Sales_item& temp)
             {
                        num = temp.num;
                        price = temp.price;
             }
             
             ~Sales_item (){}

      friend ostream& operator <<(ostream &out, const Sales_item& temp)
      {
             out << temp.isbn << " " << temp.num << " " << temp.price <<endl;
             return out;
      } 
      friend Sales_item operator +(const Sales_item& tmp1, const Sales_item& tmp2)
      {
             Sales_item temp;
             temp.num = tmp1.num + tmp2.num;
             
             return temp;
      }
      Sales_item& operator = (Sales_item& tmp2)
      {
                 num = tmp2.num;
                 price = tmp2.price;
                 return *this;
                
      }
};

int main()
{
     Sales_item test1("adf",5,5.6);
    
     
     Sales_item test2,test3;
     
     test2=test1;
     
     test3 = test1+test2;           //编译时这句出错,不是重载+,就是重载=号有问题,可是我自己看不出来
     
     cout <<test2<<endl;
     
     system("pause");
     return 0;
}

21 个解决方案

#1


Sales_item& operator = (const Sales_item& tmp2) 
兄弟,认真啊。写了那么多const,咋就这个丢了。

#2


呵呵,,,,,,因为这个出了错误,一直在改啊改的,,

#3


什么编译器,没啥错。。。

#4


DEV-c++4,9.9.2

#5




#include <iostream> 
using namespace std; 

class Sales_item 

string isbn;      //ÌõÐÎÂë 
int num;          //ÊýÁ¿ 
double price;      //¼Û¸ñ    
public: 

Sales_item ():isbn(""),num(0), price(0){} 

Sales_item (string str, int ival, double dprice):isbn(str), num(ival), price(dprice){} 


Sales_item (Sales_item& temp) 

num = temp.num; 
price = temp.price; 


~Sales_item (){} 

friend ostream& operator <<(ostream &out, const Sales_item& temp) 

out << &(temp.isbn[0]) << " " << temp.num << " " << temp.price <<endl; //string的输出得注意~~
return out; 

Sales_item operator +(const Sales_item& tmp1) //不要为友元

Sales_item temp; 
temp.num = tmp1.num + num; 

return temp; 

Sales_item& operator = (Sales_item& tmp2) 

num = tmp2.num; 
price = tmp2.price; 
return *this; 


}; 

int main() 

    Sales_item test1("adf",5,5.6); 
    
    
    Sales_item test2,test3; 
    
    test2=test1; 
    
    test3 = test1+test2;          //
    
    cout <<test2 <<endl; 
    
    system("pause"); 
    return 0; 



#6


引用 1 楼 taodm 的回复:
Sales_item& operator = (const Sales_item& tmp2) 
兄弟,认真啊。写了那么多const,咋就这个丢了。 


这个没啥吧??

#7


83 G:\文档\c++\lxt\lxt001.cpp no matching function for call to `Sales_item::Sales_item(Sales_item)' 
 note G:\文档\c++\lxt\lxt001.cpp:22 candidates are: Sales_item::Sales_item(Sales_item&) 

按5楼的改了一下,,,还是通不过。。。

#8


呃。。。自己看出来了,,,,拷贝函数。。。也没const

#9


Sales_item& operator = (Sales_item& tmp2) //应该是这个问题,把这个引用去掉
    { 
        num = tmp2.num; 
        price = tmp2.price; 
        return *this; 
        
    } 

 

#10


那个哪里是要去引用,跟引用一点关系也没有
引用 9 楼 day572 的回复:
Sales_item& operator = (Sales_item& tmp2) //应该是这个问题,把这个引用去掉 
    { 
        num = tmp2.num; 
        price = tmp2.price; 
        return *this; 
        
    } 

#11


#include <iostream> 

#include <string>
using namespace std;

class Sales_item
{
      string isbn;       //条形码 
      int num;           //数量
      double price;      //价格    
      public:
             
             Sales_item ():isbn(""),num(0),price(0){}
             
             Sales_item (string str, int ival,double dprice):isbn(str),num(ival),price(dprice){}
                        
             
             Sales_item (const Sales_item& temp)
             {
                        num=temp.num;
                        price=temp.price;
             }
             
             ~Sales_item (){}
             
      friend ostream& operator <<(ostream &out, const Sales_item& temp)
      {
             out <<temp.isbn<<" "<<temp.num<<" "<<temp.price<<endl;
             return out;
      }
      
      friend istream& operator >>(istream &in, Sales_item& temp)
      {
             in >>temp.isbn>>temp.num>>temp.price;
      }
      
   Sales_item& operator+( const Sales_item& tmp2)
      {
             // les_item temp;
     isbn=isbn+tmp2.isbn;
             num=num+tmp2.num;
             
             return *this;
      }
      
       Sales_item& operator-( const Sales_item& tmp2)
      {
             
             num=num-tmp2.num;
             
             return *this;
      }
      
      friend bool operator ==( const Sales_item& tmp1,const Sales_item& tmp2)
      {
             if (tmp1.isbn==tmp2.isbn)
             return true;
             else return false;
      }
      Sales_item& operator = (Sales_item& tmp2)
      {
         isbn=tmp2.isbn;
                 num=tmp2.num;
                 price=tmp2.price;
                 return *this;
                
      }
      
};


int main()
{
     Sales_item test1("adf",5,5.6);
     Sales_item test2,test3;
     
     test2=test1;
     cout<<test2;
     test3=test1+test2;
     
     cout <<test3<<endl;
     system("pause");
     return 0;

#12


]$ cat op.cc
#include <iostream>
using namespace std;

class Sales_item
{
      string isbn;      //���
      int num;          //��
      double price;      //�۸�  
      public:
           
            Sales_item ():isbn(""),num(0), price(0){}
           
            Sales_item (string str, int ival, double dprice):isbn(str), num(ival), price(dprice){}
                       
           
            Sales_item ( const Sales_item& temp)
            {
                        num = temp.num;
                        price = temp.price;
            }
           
            ~Sales_item (){}

            ostream& print( ostream& out ) const
            {
                out << isbn << " " << num << " " << price <<endl;
                return out;
            }
            
            Sales_item& operator = (const Sales_item& tmp2)
            {
                num = tmp2.num;
                price = tmp2.price;
                return *this;
            }

            Sales_item& operator +=( const Sales_item& other )
            {
                num += other.num;
                return *this;
            }

      friend ostream& operator <<(ostream &out, const Sales_item& temp)
      {
          return temp.print( out );
      }
      friend const Sales_item operator +(const Sales_item& tmp1, const Sales_item& tmp2)
      {
            Sales_item tmp(tmp1);
            tmp += tmp2; 
            return tmp;
      }
};

int main()
{
    Sales_item test1("adf",5,5.6);
   
   
    Sales_item test2,test3;
   
    test2=test1;
   
    test3 = test1+test2;          //����������������������أ�����⣬����Լ��������
   
    cout <<test2 <<endl;
   
    //system("pause");
    return 0;

$ g++ -o op op.cc -Wall
$ ./op
 5 5.6

#13


引用 1 楼 taodm 的回复:
Sales_item& operator = (const Sales_item& tmp2)
兄弟,认真啊。写了那么多const,咋就这个丢了。


正解,
我的拷贝函数和等号函数都没有用const是这个问题的主要错误,我一直在改=号这边了,
没注意拷贝函数。错误的原因在于,非const引用不可绑定右值,比如 
int a=5;
int &b=a;
int &c=b+a;  //这句是错误的,俺就错在这里了。     



#14



#include <iostream>
using namespace std;

class Sales_item
{
      string isbn;       //条形码 
      int num;           //数量
      double price;      //价格    
      public:
             
             Sales_item ():isbn(""),num(0),price(0){}
             
             Sales_item (string str, int ival,double dprice):isbn(str),num(ival),price(dprice){}
                        
             
             Sales_item (const Sales_item& temp)
             {
                        num=temp.num;
                        price=temp.price;
             }
             
             ~Sales_item (){}
             
      friend ostream& operator <<(ostream &out, const Sales_item& temp)
      {
             out <<temp.isbn<<" "<<temp.num<<" "<<temp.price<<endl;
             return out;
      }
      
      friend istream& operator >>(istream &in, Sales_item& temp)
      {
             in >>temp.isbn>>temp.num>>temp.price;
      }
      
      Sales_item operator +(const Sales_item& tmp2)
      {
             Sales_item temp;
             temp.num=this->num+tmp2.num;
             
             return temp;
      }
      
      friend Sales_item operator -(const Sales_item& tmp1, const Sales_item& tmp2)
      {
             Sales_item temp;
             temp.num=tmp1.num-tmp2.num;
             
             return temp;
      }
      
      friend bool operator ==(const Sales_item& tmp1, const Sales_item& tmp2)
      {
             if (tmp1.isbn==tmp2.isbn)
             return true;
             else return false;
      }
      
      Sales_item& operator = (const Sales_item& tmp2)
      {
                num = tmp2.num;
                price = tmp2.price;
                return *this;
               
      } 
      
};


int main()
{
     Sales_item test1("adf",5,5.6);
    
     
     Sales_item test2,test3;
     
     test2=test1;
     
     test3 = test1+test2;                
     
     cout <<test2<<endl;
     
     system("pause");
     return 0;
}

#15


引用 10 楼 kkndciapp 的回复:
那个哪里是要去引用,跟引用一点关系也没有引用 9 楼 day572 的回复:
Sales_item& operator = (Sales_item& tmp2) //应该是这个问题,把这个引用去掉 
    { 
        num = tmp2.num; 
        price = tmp2.price; 
        return *this; 
        
    } 

老大,你测试一下,行不? 按照楼主以前的做法,
test3 = test1+test2;
是要找这个拷贝函数  Sales_item& operator = (Sales_item tmp2 )但是没有找到.
当然
也可以添加
Sales_item& operator = (const Sales_item &tmp2 )//也可以

#16


            out < < temp.isbn < < " " < < temp.num < < " " < < temp.price < <endl; 

//temp.isbn string 可以直接cout<< 么?

#17


引用 1 楼 taodm 的回复:
Sales_item& operator = (const Sales_item& tmp2) 
兄弟,认真啊。写了那么多const,咋就这个丢了。 

 

正解, 
我的拷贝函数和等号函数都没有用const是这个问题的主要错误,我一直在改=号这边了, 
没注意拷贝函数。错误的原因在于,非const引用不可绑定右值,比如 
int a=5; 
int &b=a; 
int &c=b+a;  //这句是错误的,俺就错在这里了。    



// 怎么感觉你在误人子弟啊, 你就是把赋值重载删了也不会出错的,因为你已经有了拷贝构造函数 Sales_item& operator = (Sales_item& tmp2) 
      { 
                num = tmp2.num; 
                price = tmp2.price; 
                return *this; 
                
      } 

#18


引用 16 楼 linxy2002 的回复:
out  <  < temp.isbn  <  < " "  <  < temp.num  <  < " "  <  < temp.price  <  <endl;

//temp.isbn string 可以直接cout < < 么?

可以直接cout 


引用 15 楼 linxy2002 的回复:
老大,你测试一下,行不? 按照楼主以前的做法,
test3 = test1+test2;
是要找这个拷贝函数  Sales_item& operator = (Sales_item tmp2 )但是没有找到.
当然
也可以添加
Sales_item& operator = (const Sales_item &tmp2 )//也可以


没看明白你理解的东西,但赋值和初始化是不一样的,test3=test1+test2, 这个是赋值而不是初始化,赋值的时候是要找operatrot =  号的  ,初始化是找拷贝函数。不过,无论找什么,这个函数都得对,在函数里出现错误就不行了。在我的问题里,拷贝函数和operator=()这两个函数都出了致命的错误,所以这个加法不成功。

在我的拷贝函数和operator =()函数里,都用了非const引用做为右值参加运算,这是错误的根本,右值是不可以绑定到非const引用上的,只有const引用才能绑定右值。

VC可能是不对这个检查的,此类操作会通过,但有的时候结果并不正确,
非const引用参加右值的时候是不安全的,const引用本来就是要建一个临时对象的,以使被引用值不可被改变。而非const引用是直接指向对象,你对它操作就意谓着对象的改变。运算法则里,右值的内容是不可被改变的值。所以当非const引用直接右值参加运算的时候,编译器会报错。

以上都是本人自己理解,可能会有错误的地方,希望有高手写个详细的正确解释



#19


vc6.0下加个#include<string>就可以了,Sales_item (const Sales_item& temp)里加不加const对本程序并不影响,因为定义的类对象不是const的,当然提倡加const!(一,防止被修改 二,兼容const的类对象) 如果类对象有const的,就必须加!

#20


我的理解:
  test3=test1+test2;
  test1+test2//会产生一个临时变量 Sales_item,这个变量赋值给test3
  这时,有两种方法处理:
  1.值传递:
  Sales_item& operator = (Sales_item tmp2)//我所说的去掉引用
  2.把这个临时变量给一个引用,
  但是在c++ 语法里: 一个临时变量给一个引用typename &,就是一个non_cons &时,是绝对不行的
  必须用const &,涉及到左值,右值就太多了
  所以用这个方法: 
   Sales_item& operator = (const Sales_item &tmp2)//
  

#21


其实问题很简单。
1: test1+test2;调用重载+运算符会产生一个临时对象。
2: test3 = test1+test2;会调用=操作符
      Sales_item& operator = (Sales_item& tmp2) 
      { 
                num = tmp2.num; 
                price = tmp2.price; 
                return *this; 
                
      } 
而参数为test2. 问题处在参数类型为Sales_item& tmp2,传递的参数为(test1 + test2),为一个临时对象。
临时对象都是不可修改了,不能使用非const引用,必须将参数类型声明为const Sales_item& tmp2才能通过。
已经经过测试,没有问题。

#1


Sales_item& operator = (const Sales_item& tmp2) 
兄弟,认真啊。写了那么多const,咋就这个丢了。

#2


呵呵,,,,,,因为这个出了错误,一直在改啊改的,,

#3


什么编译器,没啥错。。。

#4


DEV-c++4,9.9.2

#5




#include <iostream> 
using namespace std; 

class Sales_item 

string isbn;      //ÌõÐÎÂë 
int num;          //ÊýÁ¿ 
double price;      //¼Û¸ñ    
public: 

Sales_item ():isbn(""),num(0), price(0){} 

Sales_item (string str, int ival, double dprice):isbn(str), num(ival), price(dprice){} 


Sales_item (Sales_item& temp) 

num = temp.num; 
price = temp.price; 


~Sales_item (){} 

friend ostream& operator <<(ostream &out, const Sales_item& temp) 

out << &(temp.isbn[0]) << " " << temp.num << " " << temp.price <<endl; //string的输出得注意~~
return out; 

Sales_item operator +(const Sales_item& tmp1) //不要为友元

Sales_item temp; 
temp.num = tmp1.num + num; 

return temp; 

Sales_item& operator = (Sales_item& tmp2) 

num = tmp2.num; 
price = tmp2.price; 
return *this; 


}; 

int main() 

    Sales_item test1("adf",5,5.6); 
    
    
    Sales_item test2,test3; 
    
    test2=test1; 
    
    test3 = test1+test2;          //
    
    cout <<test2 <<endl; 
    
    system("pause"); 
    return 0; 



#6


引用 1 楼 taodm 的回复:
Sales_item& operator = (const Sales_item& tmp2) 
兄弟,认真啊。写了那么多const,咋就这个丢了。 


这个没啥吧??

#7


83 G:\文档\c++\lxt\lxt001.cpp no matching function for call to `Sales_item::Sales_item(Sales_item)' 
 note G:\文档\c++\lxt\lxt001.cpp:22 candidates are: Sales_item::Sales_item(Sales_item&) 

按5楼的改了一下,,,还是通不过。。。

#8


呃。。。自己看出来了,,,,拷贝函数。。。也没const

#9


Sales_item& operator = (Sales_item& tmp2) //应该是这个问题,把这个引用去掉
    { 
        num = tmp2.num; 
        price = tmp2.price; 
        return *this; 
        
    } 

 

#10


那个哪里是要去引用,跟引用一点关系也没有
引用 9 楼 day572 的回复:
Sales_item& operator = (Sales_item& tmp2) //应该是这个问题,把这个引用去掉 
    { 
        num = tmp2.num; 
        price = tmp2.price; 
        return *this; 
        
    } 

#11


#include <iostream> 

#include <string>
using namespace std;

class Sales_item
{
      string isbn;       //条形码 
      int num;           //数量
      double price;      //价格    
      public:
             
             Sales_item ():isbn(""),num(0),price(0){}
             
             Sales_item (string str, int ival,double dprice):isbn(str),num(ival),price(dprice){}
                        
             
             Sales_item (const Sales_item& temp)
             {
                        num=temp.num;
                        price=temp.price;
             }
             
             ~Sales_item (){}
             
      friend ostream& operator <<(ostream &out, const Sales_item& temp)
      {
             out <<temp.isbn<<" "<<temp.num<<" "<<temp.price<<endl;
             return out;
      }
      
      friend istream& operator >>(istream &in, Sales_item& temp)
      {
             in >>temp.isbn>>temp.num>>temp.price;
      }
      
   Sales_item& operator+( const Sales_item& tmp2)
      {
             // les_item temp;
     isbn=isbn+tmp2.isbn;
             num=num+tmp2.num;
             
             return *this;
      }
      
       Sales_item& operator-( const Sales_item& tmp2)
      {
             
             num=num-tmp2.num;
             
             return *this;
      }
      
      friend bool operator ==( const Sales_item& tmp1,const Sales_item& tmp2)
      {
             if (tmp1.isbn==tmp2.isbn)
             return true;
             else return false;
      }
      Sales_item& operator = (Sales_item& tmp2)
      {
         isbn=tmp2.isbn;
                 num=tmp2.num;
                 price=tmp2.price;
                 return *this;
                
      }
      
};


int main()
{
     Sales_item test1("adf",5,5.6);
     Sales_item test2,test3;
     
     test2=test1;
     cout<<test2;
     test3=test1+test2;
     
     cout <<test3<<endl;
     system("pause");
     return 0;

#12


]$ cat op.cc
#include <iostream>
using namespace std;

class Sales_item
{
      string isbn;      //���
      int num;          //��
      double price;      //�۸�  
      public:
           
            Sales_item ():isbn(""),num(0), price(0){}
           
            Sales_item (string str, int ival, double dprice):isbn(str), num(ival), price(dprice){}
                       
           
            Sales_item ( const Sales_item& temp)
            {
                        num = temp.num;
                        price = temp.price;
            }
           
            ~Sales_item (){}

            ostream& print( ostream& out ) const
            {
                out << isbn << " " << num << " " << price <<endl;
                return out;
            }
            
            Sales_item& operator = (const Sales_item& tmp2)
            {
                num = tmp2.num;
                price = tmp2.price;
                return *this;
            }

            Sales_item& operator +=( const Sales_item& other )
            {
                num += other.num;
                return *this;
            }

      friend ostream& operator <<(ostream &out, const Sales_item& temp)
      {
          return temp.print( out );
      }
      friend const Sales_item operator +(const Sales_item& tmp1, const Sales_item& tmp2)
      {
            Sales_item tmp(tmp1);
            tmp += tmp2; 
            return tmp;
      }
};

int main()
{
    Sales_item test1("adf",5,5.6);
   
   
    Sales_item test2,test3;
   
    test2=test1;
   
    test3 = test1+test2;          //����������������������أ�����⣬����Լ��������
   
    cout <<test2 <<endl;
   
    //system("pause");
    return 0;

$ g++ -o op op.cc -Wall
$ ./op
 5 5.6

#13


引用 1 楼 taodm 的回复:
Sales_item& operator = (const Sales_item& tmp2)
兄弟,认真啊。写了那么多const,咋就这个丢了。


正解,
我的拷贝函数和等号函数都没有用const是这个问题的主要错误,我一直在改=号这边了,
没注意拷贝函数。错误的原因在于,非const引用不可绑定右值,比如 
int a=5;
int &b=a;
int &c=b+a;  //这句是错误的,俺就错在这里了。     



#14



#include <iostream>
using namespace std;

class Sales_item
{
      string isbn;       //条形码 
      int num;           //数量
      double price;      //价格    
      public:
             
             Sales_item ():isbn(""),num(0),price(0){}
             
             Sales_item (string str, int ival,double dprice):isbn(str),num(ival),price(dprice){}
                        
             
             Sales_item (const Sales_item& temp)
             {
                        num=temp.num;
                        price=temp.price;
             }
             
             ~Sales_item (){}
             
      friend ostream& operator <<(ostream &out, const Sales_item& temp)
      {
             out <<temp.isbn<<" "<<temp.num<<" "<<temp.price<<endl;
             return out;
      }
      
      friend istream& operator >>(istream &in, Sales_item& temp)
      {
             in >>temp.isbn>>temp.num>>temp.price;
      }
      
      Sales_item operator +(const Sales_item& tmp2)
      {
             Sales_item temp;
             temp.num=this->num+tmp2.num;
             
             return temp;
      }
      
      friend Sales_item operator -(const Sales_item& tmp1, const Sales_item& tmp2)
      {
             Sales_item temp;
             temp.num=tmp1.num-tmp2.num;
             
             return temp;
      }
      
      friend bool operator ==(const Sales_item& tmp1, const Sales_item& tmp2)
      {
             if (tmp1.isbn==tmp2.isbn)
             return true;
             else return false;
      }
      
      Sales_item& operator = (const Sales_item& tmp2)
      {
                num = tmp2.num;
                price = tmp2.price;
                return *this;
               
      } 
      
};


int main()
{
     Sales_item test1("adf",5,5.6);
    
     
     Sales_item test2,test3;
     
     test2=test1;
     
     test3 = test1+test2;                
     
     cout <<test2<<endl;
     
     system("pause");
     return 0;
}

#15


引用 10 楼 kkndciapp 的回复:
那个哪里是要去引用,跟引用一点关系也没有引用 9 楼 day572 的回复:
Sales_item& operator = (Sales_item& tmp2) //应该是这个问题,把这个引用去掉 
    { 
        num = tmp2.num; 
        price = tmp2.price; 
        return *this; 
        
    } 

老大,你测试一下,行不? 按照楼主以前的做法,
test3 = test1+test2;
是要找这个拷贝函数  Sales_item& operator = (Sales_item tmp2 )但是没有找到.
当然
也可以添加
Sales_item& operator = (const Sales_item &tmp2 )//也可以

#16


            out < < temp.isbn < < " " < < temp.num < < " " < < temp.price < <endl; 

//temp.isbn string 可以直接cout<< 么?

#17


引用 1 楼 taodm 的回复:
Sales_item& operator = (const Sales_item& tmp2) 
兄弟,认真啊。写了那么多const,咋就这个丢了。 

 

正解, 
我的拷贝函数和等号函数都没有用const是这个问题的主要错误,我一直在改=号这边了, 
没注意拷贝函数。错误的原因在于,非const引用不可绑定右值,比如 
int a=5; 
int &b=a; 
int &c=b+a;  //这句是错误的,俺就错在这里了。    



// 怎么感觉你在误人子弟啊, 你就是把赋值重载删了也不会出错的,因为你已经有了拷贝构造函数 Sales_item& operator = (Sales_item& tmp2) 
      { 
                num = tmp2.num; 
                price = tmp2.price; 
                return *this; 
                
      } 

#18


引用 16 楼 linxy2002 的回复:
out  <  < temp.isbn  <  < " "  <  < temp.num  <  < " "  <  < temp.price  <  <endl;

//temp.isbn string 可以直接cout < < 么?

可以直接cout 


引用 15 楼 linxy2002 的回复:
老大,你测试一下,行不? 按照楼主以前的做法,
test3 = test1+test2;
是要找这个拷贝函数  Sales_item& operator = (Sales_item tmp2 )但是没有找到.
当然
也可以添加
Sales_item& operator = (const Sales_item &tmp2 )//也可以


没看明白你理解的东西,但赋值和初始化是不一样的,test3=test1+test2, 这个是赋值而不是初始化,赋值的时候是要找operatrot =  号的  ,初始化是找拷贝函数。不过,无论找什么,这个函数都得对,在函数里出现错误就不行了。在我的问题里,拷贝函数和operator=()这两个函数都出了致命的错误,所以这个加法不成功。

在我的拷贝函数和operator =()函数里,都用了非const引用做为右值参加运算,这是错误的根本,右值是不可以绑定到非const引用上的,只有const引用才能绑定右值。

VC可能是不对这个检查的,此类操作会通过,但有的时候结果并不正确,
非const引用参加右值的时候是不安全的,const引用本来就是要建一个临时对象的,以使被引用值不可被改变。而非const引用是直接指向对象,你对它操作就意谓着对象的改变。运算法则里,右值的内容是不可被改变的值。所以当非const引用直接右值参加运算的时候,编译器会报错。

以上都是本人自己理解,可能会有错误的地方,希望有高手写个详细的正确解释



#19


vc6.0下加个#include<string>就可以了,Sales_item (const Sales_item& temp)里加不加const对本程序并不影响,因为定义的类对象不是const的,当然提倡加const!(一,防止被修改 二,兼容const的类对象) 如果类对象有const的,就必须加!

#20


我的理解:
  test3=test1+test2;
  test1+test2//会产生一个临时变量 Sales_item,这个变量赋值给test3
  这时,有两种方法处理:
  1.值传递:
  Sales_item& operator = (Sales_item tmp2)//我所说的去掉引用
  2.把这个临时变量给一个引用,
  但是在c++ 语法里: 一个临时变量给一个引用typename &,就是一个non_cons &时,是绝对不行的
  必须用const &,涉及到左值,右值就太多了
  所以用这个方法: 
   Sales_item& operator = (const Sales_item &tmp2)//
  

#21


其实问题很简单。
1: test1+test2;调用重载+运算符会产生一个临时对象。
2: test3 = test1+test2;会调用=操作符
      Sales_item& operator = (Sales_item& tmp2) 
      { 
                num = tmp2.num; 
                price = tmp2.price; 
                return *this; 
                
      } 
而参数为test2. 问题处在参数类型为Sales_item& tmp2,传递的参数为(test1 + test2),为一个临时对象。
临时对象都是不可修改了,不能使用非const引用,必须将参数类型声明为const Sales_item& tmp2才能通过。
已经经过测试,没有问题。