C++基本语言包含10章节内容,存于C++从入门到精通专栏(已完结)
类包含16章节内容,存于C++从入门到精通专栏(进行中)
目录
一、总述
类是一种自定义的数据类型(新类型)
类与类之间,又不是彼此孤立的,例如说一个类可以派生出子类,那么这个派生出子类的类 就变成了该子类的父类。
在设计一个类的时候要站在很多角度去考虑:
(1)站在设计和实现者的角度来考虑,也就是自己。类里的数据存储布局,成员变量和成员函数的定义和实现。
(2)站在使用者的角度来考虑,需要给使用者提供哪些可以访问的接口,而哪些接口不对外开放,只供类内的其他成员函数使用。
(3)父类与子类关系,在设计一个父类供子类继承的时候,如何设计这个父类。例如 设计一个车的类,然后将来可能很多子类会继承该类,如轿车、卡车、摩 托车等,那么,设计父类时,可能就要把一些车的公共特性抽取出来放到父类中,如都用油来驱动、都要在机动车道上行驶等这些公共特性。
二、类基础
(1)一个类就是一个用户自己定义的数据类型,可以把类想象成一 个命名空间,包着一堆内容(成员函数、成员变量)。
(2)一个类的构成:成员变量、成员函数。当然,也有很多特殊的成员函数,它们的名字也特殊,功能也特殊,后续会慢慢讲。
(3)访问类的成员(成员函数、成员变量)时,如果用类的对象来访问,就使用“对象名.成员名”来访问成员。如果用指向这个对象的指针来访问,就使用“指针名->成员名”来访问成员
(4)类中public修饰符修饰的成员提供类的访问接口,暴露给外界,供外界调用,private成员提供各种实现类功能的细节方法,但不暴露给外界(使用者),外界无法使用这些private成员。
(5)struct(结构)是成员默认为public的class(类)。struct的 定义一般如下:
(6) class成员默认是private的。class的定义一般如下:
也就是说 struct A{……}====class A{public:……}
建议:不建议class和struct混用,一般把没有成员函数只有成员变量的数据结构定义为 struct,有成员函数的数据结构定义为class。在编写代码中一直遵循这个规则。总之,有一个共同遵循的标准,而不是随意混用struct和class就好
三、成员函数
这是C语言中的写法,类Time和initTime函数 之间没有什么直接的关联关系。
但显然,Time类和initTime函数之间应该有关联关系。如果把initTime函数设计为类Time的成员函数,那么两者就有关联关系了。调整Time类代码(注意这里不再需要引用):
如果遵从常规的书写规范,把类定义和类实现放在分开的.h头文件 和.cpp源文件中,看看应该怎样写。在Time.h文件中,内容如下:
在Time.cpp文件中,内容如下(记得要把Time.cpp加入到项目中来):
读者可能会有一点疑惑:类定义放在一个头文件中,多个.cpp文件都包含这个头文件,那不就相当于这个类定义了多次吗?
读者都知道,一个全局变量不允许定义多次,一个类难道允许定义多次?
确实允许定义多次,类是一个特殊的存在,在多个不同的.cpp源文件 中用#include重复类定义是被系统允许的,这一点与定义一个全局变量不同。把类定义也称为“类声明”。
四、对象的复制
对象是可以复制的,上面这几种写法都是对象复制,复制后,每个对象都有不同的地址(每个对象的内容都保存在不同的内存 中,彼此互不影响),而且成员变量的值都相等。
对象的复制,就是定义一个新对象时,用另外一个老对象里面的内容进行初始化。对象的复制可以使用“=” “()”“{}”“={}”等运算符进行。
默认情况下,这种类对象的复制是每个成员变量逐个复制
那能否控制对象的这种逐个成员变量复制的行为呢?能!只要给这个类定义一个恰当的“赋值运算符(或类似的内容)” ,就能够控制对象的复制行为,这个后面再讲,读者先有个印象,这里提到的这个恰当的赋值运算符可以理解为一个成员函数,这个成员函数负责控制复制哪些成员变量。
五、私有成员
在Time类(Time.h)中增加一些成员,看如下代码:
成员函数可以访问成员变量,不管变量是否私有
类的私有成员变量和私有成员函数都只能在类的成员函数内调用,外界是无法直接调用的。 修 改Time.cpp 中 的 Time::initTime 成 员 函 数 , 在 其 中 增 加 对 initMillTime成员函数的调用,同时,增加initMillTime成员函数的实现代码:
私有成员的设置目的,主要是希望这些接口不暴露在外面,不被其他使用者所知和所用(假设自己所开发的类即将被他人使用),只为类内部的其他成员函数使用。
所以,在设计类成员的时候要好好思考,对外暴露哪些接口,哪些接口是类内部使用的。 成员函数和成员变量往上找,先找到谁就属于谁。在定义class时,默认所有成员为private,所以不加public修饰的成员全部都是private的。此外,一个类的定义中可以出现多个public、多个private,这都被系统所允许的