您的当前位置:首页正文

C++自学笔记——封装(二)和案例练习

2024-11-30 来源:个人技术集锦

上一次我们已经大致地学习了封装将属性与行为结合起来的功能,现在我们继续来学习一下封装的:

 

访问权限:

访问权限分为以下三种:

1、共有权限 public

2、保护权限 protected

3、私有权限 private

下面我们来一一介绍着三种访问权限:



共有权限 public:

对于共有权限,我们可以见名知义。也就是说具有共有权限的类,他的属性在类内是可以访问的,在类外也是可以访问的。

在这里我们再来说明对类来说,大括号内就是类内,大括号外就是类外。

共有权限的成员在类内可以访问,在类外也可以访问。


保护权限 protected:

保护权限的成员在类内可以访问,在类外不可以访问。

私有权限 private:

私有权限的成员在类内可以访问,在类外不可以访问。


通过对比,我们发现在成员的访问上,私有权限和保护权限相同,但是两者还有一定差距。在后面我们会学习到继承。那么在继承中子类可以访问父类的保护权限内容,但是子类不能访问父类的私有权限内容。现在还没学到继承,所以暂时忽略他们的差别。


好的,那么通过对类的初步学习,我们可以发现结构体struct和类class非常相似,那么下面我们学习一下:

结构体struct与类class的区别:

结构体和类的区别,就是在默认情况下,结构体是共有权限,而类是私有权限的。

这个非常好理解,我给大家上个图就完事了,请看下图:

那么通过上面两个图就能看出来,在默认情况下,类是私有权限的,调用未设置权限的类的成员会报错。


那么接下来我们再来学习:

成员属性私有化

在上边对于权限的学习中,我们可以知道,私有权限是不能从类外访问的,那么对于私有权限我们只能设置一个初始值,使用起来非常局限。

那有没有什么方法来访问到私有权限的数据呢?

那当然是有了。私有权限只能从类内访问,那么我们只要设置一个共有权限下的可以修改私有权限的函数,就可以达到对私有权限进行修改和读取的目的。

大致就是下边这样:

现在age是不能访问和修改的

我们试着写一个有共有权限的函数对age进行修改和读取:

 

 如上,我们通过函数可以让修改和读取,进而实现私有权限下的成员的只读或者只写,并且可以检验数据的有效性


那么通过前边的学习,我们已经对封装有了一定的了解,接下来就让我们写一个案例练练手吧:

案例1:设计立方体类:

案例描述:

设计一个立方体类“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。

显示全文