问个构造函数的有关问题

问个构造函数的问题头文件#includeiostream#includestringclassSales_item{friendbooloperator(cons

问个构造函数的问题
头文件
#include   <iostream>
#include   <string>

class   Sales_item   {
friend   bool   operator==(const   Sales_item&,   const   Sales_item&);
//   other   members   as   before
public:
        //   added   constructors   to   initialize   from   a   string   or   an   istream
        Sales_item(const   std::string   &book):
                            isbn(book),   units_sold(0),   revenue(0.0)   {   }
        Sales_item(std::istream   &is)   {   is   > >   *this;   }
        friend   std::istream&   operator> > (std::istream&,   Sales_item&);
        friend   std::ostream&   operator < <(std::ostream&,   const   Sales_item&);
public:
        //   operations   on   Sales_item   objects
        //   member   binary   operator:   left-hand   operand   bound   to   implicit   this   pointer
        Sales_item&   operator+=(const   Sales_item&);
        //   other   members   as   before
       
public:
        //   operations   on   Sales_item   objects
        double   avg_price()   const;
        bool   same_isbn(const   Sales_item   &rhs)   const
                {   return   isbn   ==   rhs.isbn;   }
        //   default   constructor   needed   to   initialize   members   of   built-in   type
        Sales_item():   units_sold(0),   revenue(0.0)   {   }
//   private   members   as   before
private:
        std::string   isbn;
        unsigned   units_sold;
        double   revenue;

};


//   nonmember   binary   operator:   must   declare   a   parameter   for   each   operand
Sales_item   operator+(const   Sales_item&,   const   Sales_item&);

inline   bool  
operator==(const   Sales_item   &lhs,   const   Sales_item   &rhs)
{
        //   must   be   made   a   friend   of   Sales_item
        return   lhs.units_sold   ==   rhs.units_sold   &&
                      lhs.revenue   ==   rhs.revenue   &&
      lhs.same_isbn(rhs);
}

inline   bool  
operator!=(const   Sales_item   &lhs,   const   Sales_item   &rhs)
{
        return   !(lhs   ==   rhs);   //   !=   defined   in   terms   of   operator==
}

using   std::istream;   using   std::ostream;

//   assumes   that   both   objects   refer   to   the   same   isbn


inline
Sales_item&   Sales_item::operator+=(const   Sales_item&   rhs)  
{
        units_sold   +=   rhs.units_sold;  
        revenue   +=   rhs.revenue;  
        return   *this;
}

//   assumes   that   both   objects   refer   to   the   same   isbn
inline
Sales_item  
operator+(const   Sales_item&   lhs,   const   Sales_item&   rhs)  
{
        Sales_item   ret(lhs);     //   copy   lhs   into   a   local   object   that   we 'll   return
        ret   +=   rhs;                       //   add   in   the   contents   of   rhs  
        return   ret;                       //   return   ret   by   value
}

inline
istream&  
operator> > (istream&   in,   Sales_item&   s)
{
        double   price;
        in   > >   s.isbn   > >   s.units_sold   > >   price;
        //   check   that   the   inputs   succeeded
        if   (in)
                s.revenue   =   s.units_sold   *   price;
        else  
                s   =   Sales_item();     //   input   failed:   reset   object   to   default   state
        return   in;
}

inline
ostream&  
operator < <(ostream&   out,   const   Sales_item&   s)
{
        out   < <   s.isbn   < <   "\t "   < <   s.units_sold   < <   "\t "  
                < <   s.revenue   < <   "\t "   < <     s.avg_price();
        return   out;
}

inline
double   Sales_item::avg_price()   const
{
        if   (units_sold)  
                return   revenue/units_sold;  
        else  
                return   0;
}


#endif

执行文件
#include   <iostream>
#include   "Sales_item.h "

int   main()  
{
        Sales_item   item1,   item2;

        std::cin   > >   item1   > >   item2;       //read   a   pair   of   transactions
        std::cout   < <   item1   +   item2   < <   std::endl;   //print   their   sum

        return   0;
}
这里item1   +   item2   调用了重载的+操作符,在头文件中
inline


Sales_item  
operator+(const   Sales_item&   lhs,   const   Sales_item&   rhs)  
{
        Sales_item   ret(lhs);     //   请问这个调用的是那个构造函数?似乎在头文件的定义中没有参数是lhs引用的构造类型,难道是c++有默认的这种构造方式?
        ret   +=   rhs;                       //    
        return   ret;                       //  
}
我的问题是+重载符实现的注释问题,关于构造这个构造函数的。感谢回答

[解决办法]
operator+必需重载为名字空间成员(而且一般声明为友元,直接存取私有数据成员,免去调用成员函数的开销),而并不能声明成类成员函数
[解决办法]
Sales_item ret(lhs);
编译首先会找到你的拷备构造函数Sales_item::Sales_item(Sales_item&)
没有则找你的赋值函数Sales_item::operator=(Sales_item&)
没有则自动为你构造一个浅拷备将你的成员变量值进行浅拷备

[解决办法]
Sales_item ret(lhs); // 请问这个调用的是那个构造函数?似乎在头文件的定义中没有参数是lhs引用的构造类型,难道是c++有默认的这种构造方式?
------------------------------------------------
这里调用的是copy constructor,如果你没有定义,编译器会为你自动合成一个,执行“按成员拷贝”功能。