上一次我们已经大致地学习了封装将属性与行为结合起来的功能,现在我们继续来学习一下封装的:
访问权限分为以下三种:
1、共有权限 public
2、保护权限 protected
3、私有权限 private
下面我们来一一介绍着三种访问权限:
对于共有权限,我们可以见名知义。也就是说具有共有权限的类,他的属性在类内是可以访问的,在类外也是可以访问的。
在这里我们再来说明对类来说,大括号内就是类内,大括号外就是类外。
共有权限的成员在类内可以访问,在类外也可以访问。
保护权限的成员在类内可以访问,在类外不可以访问。
私有权限的成员在类内可以访问,在类外不可以访问。
通过对比,我们发现在成员的访问上,私有权限和保护权限相同,但是两者还有一定差距。在后面我们会学习到继承。那么在继承中子类可以访问父类的保护权限内容,但是子类不能访问父类的私有权限内容。现在还没学到继承,所以暂时忽略他们的差别。
好的,那么通过对类的初步学习,我们可以发现结构体struct和类class非常相似,那么下面我们学习一下:
结构体和类的区别,就是在默认情况下,结构体是共有权限,而类是私有权限的。
这个非常好理解,我给大家上个图就完事了,请看下图:
那么通过上面两个图就能看出来,在默认情况下,类是私有权限的,调用未设置权限的类的成员会报错。
那么接下来我们再来学习:
在上边对于权限的学习中,我们可以知道,私有权限是不能从类外访问的,那么对于私有权限我们只能设置一个初始值,使用起来非常局限。
那有没有什么方法来访问到私有权限的数据呢?
那当然是有了。私有权限只能从类内访问,那么我们只要设置一个共有权限下的可以修改私有权限的函数,就可以达到对私有权限进行修改和读取的目的。
大致就是下边这样:
现在age是不能访问和修改的
我们试着写一个有共有权限的函数对age进行修改和读取:
如上,我们通过函数可以让修改和读取,进而实现私有权限下的成员的只读或者只写,并且可以检验数据的有效性
那么通过前边的学习,我们已经对封装有了一定的了解,接下来就让我们写一个案例练练手吧:
案例描述:
设计一个立方体类“cube”。并且计算并输出立方体“li_fang”和立方体“fang_kuai”的体积,还要再设置一个成员函数来对两个立方体的体积进行比较,并且输出体积比较大的立方体的名称。
那么下面我们用代码来实现一下:
#include<iostream>
using namespace std;
#include<string>
class cube//创建立方类cube
{
public:
string name;
int chang = 0;
int kuan = 0;
int gao = 0;
void print_volume()//定义一个函数用来输出体积
{
int ti_ji = chang * kuan * gao;
cout << name <<"的体积是:" << ti_ji << endl;
}
void compare_volume(cube a)//定义一个函数用来比较两个立方类的体积大小,并且输出体积较大的那个立方的名字
{
int ti_ji, tiji;
ti_ji = chang * kuan * gao;
tiji = a.chang * a.kuan * a.gao;
cout << "The bigger one is : " << ((ti_ji > tiji) ? name : a.name) << endl;
}
};
int main()
{
cube li_fang;//创建一个立方的对象li_fang,并且为li_fang的属性赋值
li_fang.name = "li_fang";
li_fang.chang = 10;
li_fang.kuan = 20;
li_fang.gao = 30;
li_fang.print_volume();
cube fang_kuai;//创建另一个立方的对象fang_kuai,并且为fang_kuai的属性赋值
fang_kuai.name = "fang_kuai";
fang_kuai.chang = 100;
fang_kuai.kuan = 50;
fang_kuai.gao = 1;
fang_kuai.print_volume();
fang_kuai.compare_volume(li_fang);//利用fang_kuai的成员函数和li_fang进行比较
system("pause");
return 0;
}
那么运行以下可以得到li_fang的体积是6000,fang_kuai的体积是5000,体积更大的是li_fang。