知识点:
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())
{
}
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;
}