《C++ Primer Plus》第五版
P297~P309 抽象和类
面向对象编程OOP特性:抽象、封装和数据隐藏、多态、继承、代码的可重用性。
为了实现这些特性并将它们组合在一起,C++所作的最重要的改进就是提供了类。
过程性编程,首先考虑要遵循的步骤,然后考虑如何表示这些数据(注意:并不需要程序一直运行,用户可能希望能够将数据存储在一个文件中,然后从这个文件中读取数据)
面向对象编程,首先从用户的角度考虑对象-描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。最后使用新的设计方案创建出程序。
类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁包。
类规范由两个部分组成:类声明(以数据成员方式描述数据部分、以成员函数方式描述共有接口)、类方法定义(描述 如何实现类成员函数)。
接口是一个共享框架,供两个系统交互时使用。对于类,我们说公共接口。公众public是使用类的程序,交互系统是由类对象组成,而接口是由编写类的人提供的方法组成。类设计禁止公共用户直接访问类,但公众可以使用类的方法。(方法是用户和类对象之间的公共接口的组成部分)
使用某个类,必须了解其公共接口;要编写类,必须创建其公共接口。
使用类对象的程序可以直接访问共有部分,但只能通过共有成员函数(或友元函数)来访问对象的私有成员。
共有成员函数是程序和对象的私有成员之间的桥梁,提供了对象和程序间的接口。防止程序直接访问数据被称为数据隐藏。关键字private标识只能通过公共成员函数访问类成员。
类设计尽可能把共有接口与实现细节分开。共有接口表示设计的抽象组件。将实现细节放在一起并将它们与抽象分开被称为封装。数据隐藏(将数据放在类的私有部分中)是一种封装,将实现的细节隐藏在私有部分中,也是一种封装。
不必在类声明中使用private,因为类对象的默认访问控制。
类与结构的区别:结构的默认访问类型是public,而类是private。C++程序员通常使用类来实现类描述,而把结构限制为只表示纯粹的数据对象或没有私有部分的类。
实现类成员函数:
1):定义成员函数时,使用作用域解析操作符::来标识函数所属的类;
2):类方法可以访问类的private组件;
类声明放在头文件中,类成员函数放在源代码文件中。
所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。
P304
cout/cerr都是ostream对象。区别:操作系统重定向只影响cout,而不影响cerr。cerr对象用于错误信息。因此,如果将程序输出重定向到文件,并且发生了错误,则屏幕上仍然会出现错误信息。在UNIX系统中,可以分别对cout和cerr进行重定向,命令行操作符>用于对cout进行重定向,操作符2>对cerr进行重定向。
P309~P318 《类的构造函数和析构函数》
构造函数没有声明类型。
构造函数的参数表示不是类成员,而是赋给类成员的值,因此,参数名不能同类成员相同。
构造函数被用来创建对象,而不能通过对象来调用。
析构函数可以没有返回值和声明类型。与构造函数不同,析构函数没有参数。
创建的是静态存储类对象时,析构函数将在程序结束时自动地被调用;
创建的是自动存储类对象时,则其析构函数将在程序执行完代码块时自动地调用;
如果对象是new创建的,则它将驻留在堆栈内存或自由存储区中,当使用delete释放内存时,调用析构函数。
如果既可以通过初始化,也可以通过赋值来设置对象的值,则应采用初始化方式。通常这种方式的效率更高。
注意:接受一个参数的构造函数允许使用赋值语句法来将对象初始化为一个值。
如果使用了new构造函数,必须使用delete的析构函数。
P317 const成员函数
P318~P322 《this指针》
每个成员函数(包括构造和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样不将不能使用this来修改对象的值。