在编程过程中总是搞不清“类”和“对象”到底是什么,觉得这个概念比较抽象,所以最近重新开始学习对象和类的概念。(参照C++ primer plus)
引用书中的概念:“类”是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合为一个整洁的包。
本人比较笨拙,还是觉得上述概念比较抽象-_-||,索性继续学习下去并尝试理解书中所给的代码的含义及使用方法,看了几页书以后认为“类”其实就是一个包,这个包里边有我们可能用到的许多方法,比如#include<math.h>中的math其实就是一个类,它里边定义了许多方法也就是我们使用的函数,诸如exp(),sqrt(),log()等等,这下子对于这个概念至少不是一团浆糊了。随后敲书上的代码学习,在这个过程中有如下发现:
(1)文件头用到了#ifndef,一开始并不理解这句话是什么意思,但是也没有太在意,就直接敲上去了,结果提示“缺少该指令的#endif”,这就一下子懵逼了(看来还是有一点不懂都要弄清楚的,即使第一眼看起来懂不懂无关紧要),在网上查看以后发现这是一种“防止该头文件被重复引用”的方法,那么什么叫做被重复引用呢,我的第一理解是“不能在不同的两个文件中使用include来包含这个头文件”,其实不然,“被重复引用”是指一个头文件在同一个cpp文件中被include了好几次,常由include嵌套造成,比如:在a.h文件中使用了#include“c.h”,然后在b.h文件中使用#include"a.h"和#include“c.h”,此时就会存在c.h重复使用引用的情况。那么头文件重复引用有什么后果呢?
1、增加编译工作量,导致编译效率降低,对于小工程而言无太大问题(但是大工程的效率低下很痛苦);
2、引发错误,比如在上述例子中的c.h中定义了全局变量,那么c.h的重复引用就会导致重复定义;
所以一般在头文件定义中加入#ifndef/#define/#endif这些代码(不加也不会引发错误,但是利于培养好的编程习惯),使用方式如下:
#ifndef A_H //if not define a.h
#define A_H //引入a.h
class xxx //类结构声明
{
......
}
#endif //与#ifndef对应
(2)类的设计。
指定类设计的第一步是提供类声明,声明中一般将数据成员放在私有部分中,成员函数放在公有部分中,C++通过类实现抽象、数据隐藏和封装。
第二步是实现类成员函数,类成员函数可以通过类对象来调用。
(3)构造函数与析构函数
构造函数是为了让开发者使用类就像使用其他标准类型一样,比如像int a;一样去初始化对象,构造函数一般又分为两种。
第一种是默认构造函数,不用提供显式的初始值即可创建对象,如Stock fluffy_the_cat;(Stock是自定义的类),在没有提供任何构造函数的情况下C++将自动提供默认构造函数。
第二种是非默认构造函数,需要显式的提供初始化值,如Stock(const char *co, int n, double pr);
而在实际设计中,通常应该提供对于所有类成员做隐式初始化的默认构造函数。
析构函数是与构造函数对应的,负责跟踪创建的对象,直到其过期为止,对象过期是,程序将会自动调用析构函数,因此在代码中不需要我们显式的调用该函数。(析构函数是没有参数的)
析构函数是用来完成清理工作的,在实际工作中意义重大,使用方式为:当构造函数使用new来分配内存时,析构函数要用delete来释放内存,而构造函数没有使用类似new来分配内存时,析构函数就没有要实际完成的工作,可以没有返回值和声明类型,析构函数的名称格式是固定的,在类名前加上“~”。
(未完待续)