类:2.1成员变量、对象复制与私有成员

C++基本语言包含10章节内容,存于C++从入门到精通专栏(已完结)

类包含16章节内容,存于C++从入门到精通专栏(进行中)

目录

一、总述

二、类基础

三、成员函数

四、对象的复制

五、私有成员

一、总述

类是一种自定义的数据类型(新类型)

类与类之间,又不是彼此孤立的,例如说一个类可以派生出子类,那么这个派生出子类的类 就变成了该子类的父类。

在设计一个类的时候要站在很多角度去考虑:

(1)站在设计和实现者的角度来考虑,也就是自己。类里的数据存储布局,成员变量和成员函数的定义和实现。

(2)站在使用者的角度来考虑,需要给使用者提供哪些可以访问的接口,而哪些接口不对外开放,只供类内的其他成员函数使用。

(3)父类与子类关系,在设计一个父类供子类继承的时候,如何设计这个父类。例如 设计一个车的类,然后将来可能很多子类会继承该类,如轿车、卡车、摩 托车等,那么,设计父类时,可能就要把一些车的公共特性抽取出来放到父类中,如都用油来驱动、都要在机动车道上行驶等这些公共特性。

二、类基础

(1)一个类就是一个用户自己定义的数据类型,可以把类想象成一 个命名空间,包着一堆内容(成员函数、成员变量)。

 (2)一个类的构成:成员变量、成员函数。当然,也有很多特殊的成员函数,它们的名字也特殊,功能也特殊,后续会慢慢讲。

(3)访问类的成员(成员函数、成员变量)时,如果用类的对象来访问,就使用“对象名.成员名”来访问成员。如果用指向这个对象的指针来访问,就使用“指针名->成员名”来访问成员

类:2.1成员变量、对象复制与私有成员_第1张图片

(4)类中public修饰符修饰的成员提供类的访问接口,暴露给外界,供外界调用,private成员提供各种实现类功能的细节方法,但不暴露给外界(使用者),外界无法使用这些private成员。

(5)struct(结构)是成员默认为public的class(类)。struct的 定义一般如下:

(6) class成员默认是private的。class的定义一般如下:

 

也就是说 struct A{……}====class A{public:……}

建议:不建议class和struct混用,一般把没有成员函数只有成员变量的数据结构定义为 struct,有成员函数的数据结构定义为class。在编写代码中一直遵循这个规则。总之,有一个共同遵循的标准,而不是随意混用struct和class就好

三、成员函数

类:2.1成员变量、对象复制与私有成员_第2张图片

这是C语言中的写法,类Time和initTime函数 之间没有什么直接的关联关系。

但显然,Time类和initTime函数之间应该有关联关系。如果把initTime函数设计为类Time的成员函数,那么两者就有关联关系了。调整Time类代码(注意这里不再需要引用):

类:2.1成员变量、对象复制与私有成员_第3张图片

如果遵从常规的书写规范把类定义和类实现放在分开的.h头文件 和.cpp源文件中,看看应该怎样写。在Time.h文件中,内容如下:

类:2.1成员变量、对象复制与私有成员_第4张图片

Time.cpp文件中,内容如下(记得要把Time.cpp加入到项目中来):

类:2.1成员变量、对象复制与私有成员_第5张图片

读者可能会有一点疑惑:类定义放在一个头文件中,多个.cpp文件都包含这个头文件,那不就相当于这个类定义了多次吗?

读者都知道,一个全局变量不允许定义多次,一个类难道允许定义多次?

确实允许定义多次,类是一个特殊的存在,在多个不同的.cpp源文件 中用#include重复类定义是被系统允许的,这一点与定义一个全局变量不同。把类定义也称为“类声明”。

四、对象的复制

类:2.1成员变量、对象复制与私有成员_第6张图片

对象是可以复制的,上面这几种写法都是对象复制,复制后,每个对象都有不同的地址(每个对象的内容都保存在不同的内存 中,彼此互不影响),而且成员变量的值都相等。

 

对象的复制,就是定义一个新对象时,用另外一个老对象里面的内容进行初始化。对象的复制可以使用“=” “()”“{}”“={}”等运算符进行。

默认情况下,这种类对象的复制是每个成员变量逐个复制

那能否控制对象的这种逐个成员变量复制的行为呢?能!只要给这个类定义一个恰当的“赋值运算符(或类似的内容)” ,就能够控制对象的复制行为,这个后面再讲,读者先有个印象,这里提到的这个恰当的赋值运算符可以理解为一个成员函数这个成员函数负责控制复制哪些成员变量。

五、私有成员

在Time类(Time.h)中增加一些成员,看如下代码:

类:2.1成员变量、对象复制与私有成员_第7张图片

成员函数可以访问成员变量,不管变量是否私有

类的私有成员变量和私有成员函数都只能在类的成员函数内调用,外界是无法直接调用的。 修 改Time.cpp 中 的 Time::initTime 成 员 函 数 , 在 其 中 增 加 对 initMillTime成员函数的调用,同时,增加initMillTime成员函数的实现代码:

类:2.1成员变量、对象复制与私有成员_第8张图片

私有成员的设置目的,主要是希望这些接口不暴露在外面,不被其他使用者所知和所用(假设自己所开发的类即将被他人使用),只为类内部的其他成员函数使用。

所以,在设计类成员的时候要好好思考,对外暴露哪些接口,哪些接口是类内部使用的。 成员函数和成员变量往上找,先找到谁就属于谁。在定义class时,默认所有成员为private,所以不加public修饰的成员全部都是private的。此外,一个类的定义中可以出现多个public、多个private,这都被系统所允许的

你可能感兴趣的:(C++从入门到精通,开发语言,c++)