C++类

类的概念
类是一个东西,类似于一个市场,
市场提供了各种各样的食物,
你需要鱼,就在这边买鱼,
你需要肉,就在那边买肉,
你需要菜,就在前边买菜。
你不知道他们的菜是怎么来的(看不见)
你不知道他们的猪是什么猪种(看不见)
你不知道他们的鱼是哪个海的(看不见)
在这里,你是用户,市场是一个类,
卖鱼,卖肉,卖菜,是接口
你能通过这些接口买到你需要的食物,
却不知道这些食物的实际生产过程(实现过程),简称实现。

类是什么
类的思想就是把数据抽象化并进行封装。

  1. 数据抽象: 数据抽象就是把接口和实现两个东西进行分离
    A. 接口: 提供给用户使用的,即用户能够进行的动作。
    B. 实现: 是接口动作的实际运行过程。
  2. 封装: 封装把实现过程进行组装从而隐藏了细节,只留下接口以供用户使用。

例子1: QQ

你可以通过输入 QQ 号来添加一个好友,
却不知道在这个添加的过程做了些什么。
你可以通过聊天窗口向好友发送信息,
却不知道这消息是如何传送给好友的。

例子2:

你知道 std:: << 20;这句代码会输出20,
却不知道这句代码是怎么输出到屏幕。
你知道 strlen (str);调用能返回str长度,
却不知道 strlen (str);如何计算出长度。

ok,理解了类我就可以继续了。

结构体
可以说,类是结构体的一个变形版本。
要明白类是怎么回事,得先弄清楚结构体是什么。

1 . 结构体组成
为了让你理解类,我们只了解结构体的一种形式。
相信我,形式不重要,只要你理解了原理,
形式就轻而易举。
结构体由 struct 关键字后紧跟一个名字(随意命名,有时可以没有)再接一个由 {包含的成员}。
结构体的出现,是为了把实际的东西抽象化为代码来进行操作,例如:

struct Personal // 结构 { char Name[20]; // 名字 int Old; // 年龄 };
以上,为了与结构体的内容相符合,我把结构体命名为Personal(个人),其意义代表个人信息的意思。

Name 用于保存一个人的名字,
Old 则用于保存一个人的年龄。

一个 Personal 就是一个人,并带有两项信息分别是名字和年龄。

我们可以声明一个结构变量来保存 小明的信息
Personal Xiaoming; // 小明的个人信息

我们还可以再声明一个结构变量来保存小红的信息。
Personal Xiaohong;// 小红的个人信息

我们知道,一个Personal 就包含两个信息,名字和年龄,因此用 Personal 声明的变量Xiaoming 和 Xiaohong 也分别包含这两项信息。类似于我们用 int 声明一个变量 a int a;,左边是类型,右边是变量,类型规定了变量会保存什么样的值。
而在这里

变量 a 会保存一个整数且只能是整数
变量 Xiaoming 保存一个名字和一个年龄。
变量 Xiaohong 保存一个名字和一个年龄。

假设小明是哥哥,小红是妹妹,
他们与爸爸妈妈共同组成一个家庭,例如:

struct Family // 家庭 { Personal Father; //爸爸,包含名字和年龄 Personal Mother; //妈妈,包含名字和年龄 Personal Brother //哥哥,包含名字和年龄 Personal Sister; //妹妹,包含名字和年龄 }
Family(家庭的意思),一个 Family 就代表一个家庭。
例如: Family Xmfamily; // 小明的家庭
我们看到,这个家庭包含了四个成员分别是: 爸爸,妈妈,哥哥,妹妹,每个成员(Personal)分别包含两项信息,名字 和 年龄。

同样的结构还能保存不同的家庭,只要家里的所有成员是 4人,
例如:Family Me; // 这是我的家庭成员。
另外你可以根据需要,添加 Personal 结构体的成员,
例如: 不止是名字和年龄,还能增加身高,学历等个人信息。

struct Personal { char Name [20]; // 名字 int Old; // 年龄 double Height; // 身高 char Education[20]; // 学历 };
而 Family 结构体也可以增加更多成员,以符合一个家庭有多人的情况,甚至包括已经结婚的人的子女等。但这样未免有些过于复杂,你可以先在这里暂缓一下。理清一下思路,然后我们再继续开始。

2 . 访问成员
知道了结构体是怎么回事,我们还得研究一下如何访问成员。
假设我们现在要去小明家询问小明的名字和年龄
首先我们应该去小明家(Xmfamily),
即 Xmfamily// 小明的家
到他家后访问小明这个人,我们知道小明是哥哥。
即 Xmfamily.Brother; // 这个家的哥哥成员
现在我们问哥哥的名字叫什么
即 Xmfamily.Brother.Name; //这个哥哥成员的名字
接着我们再问哥哥的年龄是多少
即 Xmfamily.Brother.Old; // 哥哥成员的年龄

由于这里是我们假设出了小明这个人,
实际中如果真的存在小明这个人的话,
我们应该事先给它保存信息,
例如:小明去年是 14岁,真名叫王明,

Xmfamily.Brother.Name = “王明”; Xmfamily.Brother.Old = 14;
在今年小明是 15岁了,我们应该为我们的程序在每年的年龄上增加 1,
Xmfamily.Brother.Old +=1 ;
更好的增加年龄的方式是使用自加(++)运算符,但这里只为了让你容易理解。

因此,在访问成员时就可对其进行取值,同时也可以对其进行赋值。而整个访问方式采用符号 . 来访问每个成员,包括每个成员的嵌套成员。

例如: Xmfamily.Sister

这里 Sister 是 Xmfamily 里的一个直接成员。

例如: Xmfamily.Sister.Old

这里,Old 是 Sister 的直接成员,
Sister 又是 Xmfamily 的直接成员
因此 Old 是 Xmfamily 的嵌套成员。

这便是结构里的结构。

即一个 Family 结构体里面的每个成员又包含了另一个结构 Personal ,
而 Personal 结构里又包含两个成员,分别是 Name 和 Old!我们知道 Name 和 Old 前面的类型不是结构类型,而只是简单的 char(字符类型)和 int(整数类型),这两个仅仅是一个单数据类型。

当我们使用结构来作为另一个结构的成员时

struct Family { Personal A; // 成员A包含两项数据 };
如果它被展开则是这样

struct Family { Personal A // 成员 A 包含以下两项数据 { char Name[20]; // 一个名字 int Old; // 一个年龄 }; };
如果你此时用 Personal 又声明了一个 B,
那么 B 又是一个 Personal 结构也包含两个成员。
所以,A 和 B 之间是相互独立的,
你不会因为给 A 修改年龄,而作用到 B 的年龄上去。
以下给出 A 和 B 成员是如何相互独立的:

struct Family { Personal A // 成员 A 包含两项数据 { char Name[20];//一个名字 int Old; //一个年龄 }; Personal B // 成员 B 包含两项数据 { char Name[20]; // 一个名字 int Old; // 一个年龄 }; };
假设使用 Family 声明了一个结构变量
Family item;
我们保存一本书的页数信息作为 A 成员

item.A.Name = “《语文》” // 一本语文课本 item.A.Old = 200; // 200 页
此时在结构体内相当于发生了这样的事情

struct Family { Personal A // 成员 A { char Name[20]= “《语文》”; int Old=200; // 书有 200 页 }; Personal B // 成员 B { char Name[20]; int Old; }; };
A 成员被赋值,而 B 成员没有任何改变,
如果 B 成员是保存数学书的页数,就依然是数学书和它的页数。
虽然 A 和 B 有相同的结构,但是 A 和 B 之间是相互独立的各自的结构。
这跟 int a=20; int b=0; 一样,
你保存在 a 的整数 20 不可能跑到 b 去。
虽然 C语言有指针 和C++ 有引用跟指针可以提供类似的功能。但,不是真正的跑过去,a 还是 a,b 还是 b 的值。

为了便于让你理解我省去了细节部分,所以以上代码不可直接编译,除非你懂结构。否则直接复制粘贴编译时将会有错误信息。
这一部分是重点,理解了结构,类就不在话下,类只是增加一系列扩展将结构发挥到极致。C++中把结构说成类,虽然类有自己的特性,但也是以结构体为思路。

成员
在上面结构中,共同组成一个结构的所有变量,我们称之为结构体的成员。
类的成员与此相同。
在我们介绍下面一些类的特性之前,我们再讨论一遍结构体自己的特性。

成员函数
成员函数是类的一个特性。

this 指针
在类中引入 this 指针,这是类的另一个特性
常量成员函数
由 this 指针,引出了常量的成员函数,又是一个特性

发布了282 篇原创文章 · 获赞 4 · 访问量 5621
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览