《C++ Primer Plus》第10章知识点总结
类规范由两个部分组成
类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口
类方法定义:描述如何实现类成员函数
接口
接口是一个共享框架,供两个系统(如计算机和打印机之间)交互时使用
封装
将类的实现细节放在一起并将它们与抽象分开被称为封装。数据隐藏(将数据放在类的私有部分)是一种封装,将实现的细节隐藏在私有部分也是封装。封装的另一个例子是,将类函数定义和类声明放在不同的文件中。
默认访问控制
类声明中可以不必使用关键字private,因为这是类对象的默认访问控制
结构的默认访问类型时public
实现类成员函数
定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类
类方法可以访问类的private组件
内联方法
定义位于类声明中的函数都将自动称为内联函数
如果愿意,也可以在类声明之外定义成员函数,并使其称为内联函数,只需在类实现部分中定义函数时使用inline限定符即可。如:
class Stock{}
inline void Stock::set_tot(){...}
类的构造函数和析构函数
类构造函数
专门用于构造对象、将值赋给它们的数据成员
构造函数的参数名与类成员不能相同,否则最终代码将会造成混乱。一种常见的做法是在数据成员名中使用m_前缀或_后缀
使用构造函数
//显示地调用构造函数
Stock food=Stock("World Cabbage",250,1.25);
//隐式地调用构造函数
Stock garment("Furry Mason",50,2.5);
但无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创建对象,而不能通过对象来调用。
默认构造函数
这是在未提供显式初始值时,用来创建对象的构造函数
需要注意的是,当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须为它提供默认构造函数。
默认构造函数没有任何参数,因此如果创建对象时没有进行显式地初始化,则将调用默认构造函数。如果程序中没有提供任何构造函数,则编译器会为程序定义一个默认构造函数;否则,必须自己提供默认构造函数。默认构造函数可以没有任何参数;如果有,则必须给所有参数都提供默认值
定义默认构造函数的方法有两种
(1)给已有构造函数的所有参数提供默认值。当用这种时,只需在声明处写了就可以,不用在定义中再具体写
Stock(const string& co="Error",int n=0,double pr=0.0);
(2)通过函数重载来定义另一个构造函数——一个没有参数的构造函数
Stock();
由于只能由一个默认构造函数,因此不要同时采用这两种方式
析构函数
对象过期时,程序将自动调用一个特殊的成员函数——析构函数,完成清理工作
和构造函数一样,析构函数的名称很特殊:在类名前加上~
析构函数没有任何参数,因此Stock析构函数必须是这样的:~Stock();
由于Stock的析构函数可以不承担任何重要的工作,因此可以将它编写为不执行任何操作的函数
析构函数的调用
(1)如果创建的是静态存储类对象,则其析构函数将在程序结束时自动被调用
(2)如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时(该对象是在其中定义的)自动被调用
(3)如果对象是通过new创建的,则它将驻留在栈内存或自由存储区中,当使用delete来释放内存时,其析构函数将自动调用
(4)程序可以创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象的使用时自动调用其析构函数
const成员函数
将const关键字放在函数的括号后面,表示保证函数不会修改调用对象,例:
void show() const;
this指针
this指针指向用来调用成员函数的对象
如果方法需要引用整个调用对象,则可以使用表达式*this
对象数组
const int STKS=4;
Stock stock[STKS]=
{
Stock("Nanno",12.5,20),
Stock("Boffo",200,2.0),
Stock(),
Stock("Fleep",60,6.5)
};
初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。因此,要创建类对象数组,则这个类必须有默认构造函数。