C++ primer之第七章(类 1)

知识点:
    1.constexpr  返回常量表达式的函数,一个constexpr函数被隐式地声明成内联函数。

    2.() 调用运算符,用于执行某函数。括号前面是函数名或函数指针,括号内是以逗号隔开的实参列表(可以为空)。

     3.类的基本思想是数据抽象和封装,数据抽象是依赖接口和实现的分离的编程技术。类的接口包括用户所能执行的操作,类的实现则包括类的数据成员,以及接口实现的函数体和各种私有函数。

     4. 关于this 和const 成员函数;要明白的是this 总是指向调用它的那个对象,所以this是个常量指针,不允许改变this中保存的地址。那么在成员函数中,不允许改变对象的内容怎么做呢? 如果是普通指针和函数,把指针定义成const(顶层),再把指针所指的对象定义成常量(底层const)就可以了。但是,在this是隐式的不会出现在参数列表中,所以C++的做法是:把const 关键字 放在后面来表示this 是一个指向常量的指针,也即常量成员函数。

    5. 常量对象,以及常量对象的引用或指针 都只能调用 常量成员函数

    6. 成员函数可以随意使用类中的成员,不需要在意成员的出现次序。 因为编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体。

    7.一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件内。


习题:
    7.03 答:将7.01的最内层的if语句快及判断条件换成判断好的函数。
    7.08 答:输出函数+const,防止数据被修改。
    7.09 答:因为某些原因,这章练习时没有分离编译。但是,后面要分开,头文件是类的声明+类的非成员接口函数声明+全局变量等等
    大部分函数实现都在.cpp文件里。
    7.10 答:从内向外,先判断写入第一个data,然后将第一个read返回的流结果当做是第二个read的输入,最后判断第二个read返回流的结果状态。
istream&firstStep = read(cin,data1);
istream&secondStep = read(firstStep,data2)
if (secondStep)



程序题:
习题:fun7_01 //模拟Sales——data 实现出仓统计
#include  <iostream>
#include  <string>
using  namespace  std;
class  Sales_data{
      public :Sales_data();
              string bookNo;                //图书编号
               unsigned  unit_sold;       //售出数量
               double  revecnue;          //销售收入
};
Sales_data::Sales_data()
{
     unit_sold = 0;
     revecnue = 0.0;
}
//该程序是统计图书类的 销售情况
int  main( int  argc,  char  *argv[])
{
     cout<< "请输入图书编号,数量,收入:  " <<endl;
     Sales_data total;
      if (cin>> total.bookNo >> total.unit_sold >> total.revecnue)
     {
           Sales_data trans;
            while (cin>> trans.bookNo >> trans.unit_sold >> trans.revecnue)
           {
                 if (total.bookNo == trans.bookNo)
                {
                     ++total.unit_sold;
                     total.revecnue += trans.revecnue;
                }
                 else
                {
                     cout<< '\t' << "编号 " << '\t' << "数量 " << '\t' << "销售总额 " <<endl;
                     cout<< '\t' <<total.bookNo<< '\t' <<total.unit_sold<< '\t' <<total.revecnue<<endl;
                      total = trans;
                }
                cout<< '\t' << "编号 " << '\t' << "数量 " << '\t' << "销售总额 " <<endl;
                cout<< '\t' <<total.bookNo<< '\t' <<total.unit_sold<< '\t' <<total.revecnue<<endl;
           }
     }
      else
           cout<< "输入有误! " ;
      return  0;
}
习题:7_02
#include  <iostream>
#include  <string>
using  namespace  std;
class  Slaes_data
{
public :
     Slaes_data();
     string bookNo;            //图书编号
     unsigned  unit_sold;       //售出数量
     double  revecnue;          //销售收入
     string  isbn()  const
     {
            return  (* this ).bookNo;
     }
     Slaes_data &combine( const  Slaes_data& );
};
Slaes_data::Slaes_data()
{
     unit_sold = 0;
     revecnue = 0;
}
Slaes_data& Slaes_data::combine( const  Slaes_data &rhs)
{
      this ->unit_sold += rhs.unit_sold;
      this ->revecnue += rhs.revecnue;
      return  * this ;
}
int  main( int  argc,  char  *argv[])
{
      return  0;
}
习题:fun7_04 && fun7_05 
#include  <iostream>
using  namespace  std;
class  person
{
     person();
     string name;
     string adress;
     string print_name()  const ;
     string print_adr()    const ;
};
string person::print_name()  const
{
      return  this ->name;
}
string person::print_adr()  const
{
      return  this ->adress;
}
习题:fun7_06和fun7_07
#include  <iostream>
#include  <string>
using  namespace  std;
class  Slaes_data
{
public :
     Slaes_data();
     string bookNo;            //图书编号
     unsigned  unit_sold;       //售出数量
     double  revecnue;          //销售总收入
     string  isbn()  const
     {
            return  (* this ).bookNo;
     }
     Slaes_data &combine( const  Slaes_data& );
      int  avg_price()  const ;
};
Slaes_data::Slaes_data()
{
     unit_sold = 0;
     revecnue = 0;
}
Slaes_data& Slaes_data::combine( const  Slaes_data &rhs)
{
      this ->unit_sold += rhs.unit_sold;
      this ->revecnue += rhs.revecnue;
      return  * this ;
}
int  Slaes_data::avg_price()  const
{
      if ( this ->unit_sold)
            return  this ->revecnue/ this ->unit_sold;
      else
            return  0;
}
//类读入函数而该函数主要通过istream的对象然后集中输入到流里
//所以返回类型是istream,IO对象没有拷贝操作,无法传值,所以用引用,
istream &read(istream &in, Slaes_data &item)
{
      double  price = 0;
     in>>item.bookNo >> item.unit_sold >> price;
     item.revecnue = item.unit_sold * price;
      return  in;
}
//输出函数与 读入函数类似
ostream &prin(ostream &ou,  const  Slaes_data &item)
{
     cout<< "编号" << '\t' << "数量" << '\t' << "总价" << '\t' << "平均价" <<endl;
     ou<<item.isbn() << '\t' <<item.unit_sold << '\t' <<
           item.revecnue<< '\t' <<item.avg_price();
      return  ou;
}
Slaes_data add( const  Slaes_data &item1,  const  Slaes_data &item2)
{
     Slaes_data sum = item1;   //这里只拷贝数据成员
      return  sum;
}
int  main( int  argc,  char  *argv[])
{
     Slaes_data total;
     cout<< "请输入编号  " << " 数量 " << " 单价 " <<endl;
      if (read(cin, total))
     {
           Slaes_data trans;
            while (read(cin, trans))
           {
                 if (total.isbn() == trans.isbn())
                {
                 total.combine(trans);
                }
                 else
                {
                     prin(cout, total);
                     total = trans;
                }
                prin(cout, total)<<endl;
           }
           
     }
      else
     {
           cout<< "没有数据! " <<endl;
            return  -1;
     }
           
      return  0;
}
习题:7_09
#include  <iostream>
#include  <string>
using  namespace  std;
class  person
{
public :
     person();
     string name;
     string adress;
     string print_name()  const ;
     string print_adr()    const ;
};
string person::print_name()  const
{
      return  this ->name;
}
string person::print_adr()  const
{
      return  this ->adress;
}
istream &read(istream &in,  person &per1)
{
     in>>per1.name >> per1.adress;
      return  in;
}
ostream &prin(ostream &ou,  const  person &per1)
{
     ou<<per1.name << per1.adress;
      return  ou;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值