类作用域

来源:互联网 发布:淘宝延期收货是几天 编辑:程序博客网 时间:2024/05/29 07:34


           class 和 struct定义类唯一的区别就是默认的访问权限。如果使用struct关键字,则定义第一个访问说明符之前的成员是
public的;相反,如果我们使用class关键字,则这些成员是private的

class Sales_data{
public:
    friend Sales_data add(const Sales_data&, const Sales_data&);
    friend std::ostream &print(std::ostream&, const Sales_data&);
    friend std::istream &read(std::istream&, Sales_data&);

    Sales_data();//= default;  
    Sales_data(const std::string &s):bookNo(s){}
    Sales_data(const std::string &s,unsigned n,double p):
               bookNo(s),units_sold(n),revenue(p*n){}
    Sales_data(std::istream &);
   
    std::string isbn() const {return bookNo;}
    Sales_data& combine(const Sales_data&);
private:
    double avg_price() const;
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);
//----------------------------------------类成员函数定义-------------------------------
double Sales_data::avg_price() const{ 
    if(units_sold)
        return revenue/units_sold;
    else
        return 0;
}
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold; 
    revenue += rhs.revenue;
    return *this;                 
}

istream &read(istream &is,Sales_data &item)
{
    double price = 0;
    is>>item.bookNo >> item.units_sold >> price;
    item.revenue = price * item.units_sold;
    return is;
}
ostream &print(ostream &os,const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " "
       << item.revenue << " " << item.avg_price();
    return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
    Sales_data sum = lhs;         
    sum.combine(rhs);
    return sum;
}
//-----------------------------------p238--在类的外部定义构造函数
Sales_data::Sales_data(std::istream &is)
{
    read(is,*this);                        
}


        成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在类的外部。作为接口组成部分的非成员函数,
例如add、read和print等,他们的定义和声明都在类的外部。



0 0
原创粉丝点击