第10章对象和类
1、OOP的特性
※抽象
※封装和数据隐藏
※多态
※继承
※代码可重用
2、类抽象
处理复杂性的方法之一是简化和抽象,OOP当中对于一个对象从用户的角度,描述对象所需要的数据以及与数据交互所需要的操作(接口),C++当中用户定义类型指的是实现抽象接口的类设计。
3、C++当中的类
C++当中,类由两部分组成:数据和成员函数。数据部分是类存储的内容,成员函数则是类与外部的接口
类规范由两部分组成:类声明和类方法实现。一般将类声明放在一个文件当中,类方法实现放在另一个文件,即声明和实现分离,这也是一种数据隐藏和封装的手段。类声明提供了类的蓝图,而类方法则实现成员函数,提供细节。
4、类的访问控制
关键字private、public和protected描述了对类成员的访问控制。使用类对象的程序都可以直接访问公有部分,但只能使用公有成员函数或者友元函数来访问对象的私有成员。
防止程序直接访问数据称为数据隐藏。公有成员函数则为程序和对象的私有成员之间的桥梁。
5、类和结构的区别
类和结构的唯一区别在于:结构的默认访问类型为public,而类的默认访问类型为private。
6、类成员函数
※定义类成员函数时,使用作用域解析运算符::来标识函数所属的类
※类方法可以访问类的私有成员
7、内联函数
定义位于声明内的函数会自动成为内联函数;
也可以在类外声明函数,使其成为内联函数,使用inline限定符。
8、一般在数据成员名前加上m_,例如m_company
9、构造函数
构造函数的作用是为了初始化类对象。
(1) 声明构造函数
构造函数的名称和类名称相同。例如,Stock(const string& co, long n=0,doublepr=0.0)
(2) 使用构造函数
C++提供两种使用构造函数来初始化对象的方式:
第一种为显式调用构造函数:Stock food=Stock(“world”,250,1.25)
另一种为隐式调用构造函数:Stock garment(“Furry”,50,2.5),等价于Stockgarment = Stock(“Furry”,50,2.5)
动态对象:Stock *pc=new Stock(“Popo”,30,2.5)
(3) 默认构造函数
如果不定义构造函数,那么编译器会自动产生一个构造函数,Stock::Stock(){}
,但是为类定义了构造函数后,就必须为它提供默认构造函数!!!
定义默认构造函数的方式有两种:
①第一种是给所有参数提供默认值
Stock(const string &co=”Error”, int n=0, double pr=0.0)
②通过函数重载来定义另一个没有参数的构造函数
Stock()
10、析构函数
构造函数创建对象后,程序跟踪对象,直到其过期为止,然后调用析构函数来完成清理工作。
析构函数没有参数,原型为:~Stock()。
11、C++列表初始化
C++11中,可以使用列表初始化来初始化对象,
Stock jock={“Derivation”,100,45.0}
12、const成员函数
如果要求类成员不修改调用的对象,则应将该成员声明为const,例如,
void stock::show()const
13、this指针
this指针指向用来调用成员函数的对象,this为对象的地址,*this才是对象本身。如果需要显式地调用对象,可以使用this。
14、对象数组
一旦声明和定义了类,那么类就类似于普通的内置数据类型,所以可以声明对象数组:Stock stuff[4]
15、类作用域
在类中定义的名称的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外则未知。
(1) 作用域为类的常量
使符号厂里的作用域为类有两种方法:
①第一种方法实在类中声明一个枚举,其作用域为整个类。这种方式声明枚举并不会创建数据成员,即所有对象都不会包含枚举,在作用域为整个类的代码中遇到它时,编译器将用12替换它。
class Bakery
{
Private:
enum {month=12};
double costs[month];
……
}
②第二种方式是使用关键字static
class Bakery
{
private:
static const int month=12;
double costs[month];
……
}
16、类很适合描述抽象数据类型ADT,例如栈stack