C++学习笔记:封装、访问权限


前言

关于对象和类的关系:万事万物都可为对象,而具有相同性质的对象,可以抽象集合为对象,类是对象的抽象,而对象是类的具体实例。如熊猫属于动物,学生属于人。在C++中,类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。类一般由属性(成员变量)和方法(成员函数)构成。C++中面向对象的三大特性为:封装、继承和多态,本节主要讲封装。


一、封装的意义

封装是C++面向对象三大特性之一
封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

二、使用方法

在设计类的时候,属性和行为写在一起,表现事物,语法为:class 类名{访问权限:属性 / 方法}
示例1: 设计一个圆类,求圆的周长
代码如下:

//圆周率
const double PI = 3.14;

//1、封装的意义
//将属性和行为作为一个整体,用来表现生活中的事物

//封装一个圆类,求圆的周长
//class代表设计一个类,后面跟着的是类名
class Circle
{
public:  //访问权限  公共的权限

	//属性
	int m_r;//半径

	//方法
	//获取到圆的周长
	double calculateZC()
	{
		//2 * pi  * r
		//获取圆的周长
		return  2 * PI * m_r;
	}
};

int main() {

	//通过圆类,创建圆的对象
	// c1就是一个具体的圆
	Circle c1;
	c1.m_r = 10; //给圆对象的半径 进行赋值操作

	//2 * pi * 10 = = 62.8
	cout << "圆的周长为: " << c1.calculateZC() << endl;

	system("pause");

	return 0;
}

其中,Circle类中的m_r属性、calculateZC()方法均为公共权限。
示例2: 设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号。
代码如下:

//学生类
class Student {
public:
	void setName(string name) {
		m_name = name;
	}
	void setID(int id) {
		m_id = id;
	}

	void showStudent() {
		cout << "name:" << m_name << " ID:" << m_id << endl;
	}
public:
	string m_name;
	int m_id;
};

int main() {

	Student stu;
	stu.setName("德玛西亚");
	stu.setID(250);
	stu.showStudent();

	system("pause");

	return 0;
}

其中,Student类中的setName、setID、showStudent方法、m_name、m_id属性均为公共权限。

三、访问权限

类在设计时,会把属性和行为放在不同权限下,访问权限有以下三种:

语法名称权限范围
public公共权限类内可以访问 类外可以访问
protected保护权限类内可以访问 类外不可以访问
private私有权限类内可以访问 类外不可以访问

其中,保护权限和私有权限的区别为:在继承中,保护权限下,子类可以访问父类中的保护内容,而私有权限,子类不可以访问父类中的私有内容。

示例代码如下:

class Person
{
	//姓名  公共权限
public:
	string m_Name;

	//汽车  保护权限
protected:
	string m_Car;

	//银行卡密码  私有权限
private:
	int m_Password;

public:
	void func()
	{
		m_Name = "张三";
		m_Car = "拖拉机";
		m_Password = 123456;
	}
};

int main() {

	Person p;
	p.m_Name = "李四";
	p.m_Car = "奔驰";  //保护权限类外访问不到
	p.m_Password = 123; //私有权限类外访问不到

	system("pause");

	return 0;
}

上述代码中,对于具有保护权限的m_Car属性和具有私有权限的m_Password属性,无法在类外进行访问,因此编译器会报错:
在这里插入图片描述
一般的,对于私有权限的属性和方法,可以通过类内的公共权限的方法进行获取或使用,示例代码如下:

class Student {
private:
	string m_name;
	int m_id;
	void print() {
		cout << "这是个私有方法" << endl;
	}
public:
	void setName(string name) {
		m_name = name;
	}
	void setID(int id) {
		m_id = id;
	}
	void showStudent() {
		cout << "name:" << m_name << " id:" << m_id << endl;
	}
	void getPrint() {
		print();
	}
};

int main() {


	Student stu;
	//stu.m_id = 250;	//私有权限 无法在类外获取
	// 对私有权限的属性进行修改和获取
	stu.setID(250);
	stu.setName("德玛西亚");
	stu.showStudent();
	// 通过公共权限的方法对私有权限的方法进行调用
	stu.getPrint();

	system("pause");
	return 0;
}

上述代码中,私有权限下的m_name、m_id可以通过公共权限的setName()、setID()方法在类外进行修改,并通过showStudent()进行获取,代码中通过具有公共权限的getPrint()对具有私有权限的print()方法进行调用。代码运行结果如下:
在这里插入图片描述


四、struct和class的区别

类描述看上去很像是包含方法以及public和private可见性标签的结构声明。实际上,C++对结构进行了扩展,使之具有与类相同的特性。它们之间唯一的区别是,结构的默认访问类型是public,而类为private。即:

  • struct 默认权限为公共
  • class 默认权限为私有
    示例代码如下:
class C1
{
	int  m_A; //默认是私有权限
};

struct C2
{
	int m_A;  //默认是公共权限
};

int main() {

	C1 c1;
	c1.m_A = 10; //错误,访问权限是私有

	C2 c2;
	c2.m_A = 10; //正确,访问权限是公共

	system("pause");

	return 0;
}

上述代码中,编译器出现报错提示:
在这里插入图片描述


参考

视频《黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难》
书籍《C++ Primer Plus》(第六版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值