习题答案请参考:C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)习题答案
目录
7.1 类讲解(成员函数、非成员函数、构造函数)
类的基本思想是数据抽象和封装
数据抽象:依赖于接口和实现分离的编程
接口:用户所能执行的操作
类的实现:类的数据成员、负责接口实现的函数体、定义类所需的私有函数
封装:实现类的接口和实现的分离
成员函数
(1)声明在类的内部,定义则既可以在内部也可以在外部
this
this是一个隐式形参,是一个常量对象,用来访问调用成员函数的对象,如:
total.isbn(),其实是把total的地址传递给了isbn的隐式形参this
const成员函数 (常量成员函数)
以如下例子来讲解const成员函数,isbn是一个类的成员函数,定义如下:
string isbn() const { return bookNo;}
上述定义isbn函数中的关键字const,修改this指针类型,表示this是一个指向常量的常量指针
默认情况下,this的类型是指向类类型非常量对象的常量指针,不能在一个常量对象上调用普通的成员函数
类作用域和成员函数
类中的编译:
(1)编译数据成员
(2)编译成员函数体
所以,成员函数体可以随意使用类中的成员而无须在意这些成员出现的次序
类外部定义成员函数
(1)与声明完全相同(返回类型、参数列表、函数名)
(2)外部定义成员函数的名字必须包含所属的类名
定义一个返回this对象的函数
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
units_sold += rhs.untis_sold; //把rhs的成员加到this对象的成员上
rebenue += rhs.revenue;
return *this; //返回调用该函数的对象
}
当调用该函数时:total.combine(trans) ,total的地址被绑定到隐式的this上,rhs绑定了trans,因此:
units_sold += rhs.untis_sold;等价于this.units_sold += rhs.untis_sold;(total.units_sold += rhs.untis_sold;)这里this是隐式的,可以省略。最后结果存储在this.units_sold(total.units_sold),所以最后返回整个对象是:return *this
小贴士!!!
一般来说,当我们定义的函数类似于某个内置运算符时,应该令该函数的行为尽量模仿这个运算符。内置的赋值运算符把它当的左侧运算符当成左值返回,因此为了保持一致,combine函数必须返回引用类型,因为左侧对象是一个Sales_data的对象,所以返回类型应该是Sales_data
非成员函数
(1)定义和声明都在类的外部
(2)声明和定义在同一个文件内
构造函数
构造函数定义
初始化类对象的数据成员
构造函数特性
(1)构造函数的名字和类名相同
(2)构造函数没有返回类型
(3)构造函数不能被声明成const
=default
用来构成默认构造函数
用法:在参数列表后面加上=default,如:
Sales_data=default; //声明默认构造函数
构造函数初始值列表
Sales_data(const string &s, unsigned n, double p):
bookNo(s), units_sold(n), revenue(p*n) {}
冒号之后的则为构造函数初始值列表,显示的初始化数据成员
类的外部定义构造函数
Sales_data::Sales_data(istream &is)
{
read(is, *this) //read函数是从is中读取一条交易,存储在this对象中
}
类外部定义构造函数:
(1)指明是属于哪个类
(2)构造函数名字和类名相同