01-2 封装的意义-访问权限
在学习 01-1 的时候,我们已经了解过封装的意义了:
- 将属性和行为作为一个整体。
- 将属性和行为使用权限进行管控。
前者我们已经学习过了,定义一个类,这个类里面有访问权限、属性和行为。其语法是:class 类的名称 {访问权限: 属性 / 行为};
。
现在,我们学习的是封装的第二个意义:将属性和行为使用权限进行管理。
在设计类的时候,可以把属性和行为放在不同的权限下,加以控制。
访问权限有如下三种:
public
:公共权限:类内可以访问,类外可以访问。protected
:保护权限:类内可以访问,类外不可以访问。private
:私有权限:类内可以访问,类外不可以访问。
其中,保护权限(protected
)和私有权限(private
)都是在类内可以访问,类外不可以访问的。这两个权限的区别主要体现在继承之中。
- 保护权限(
protected
):父项数据子项可以访问。 - 私有权限(
private
):父项数据子项也不可以访问。
#include <iostream>
#include <string>
using namespace std;
//访问权限:
//1. `public`:公共权限:类内可以访问,类外可以访问。
//2. `protected`:保护权限:类内可以访问,类外不可以访问。 父项数据子项可以访问。
//3. `private`:私有权限:类内可以访问,类外不可以访问。 父项数据子项也不可以访问。
class persion
{
//公共权限
public:
string name;
//保护权限
protected:
int age;
//私有权限
private:
int password;
public:
void print()
{
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "密码:" << password << endl;
}
void set()
{
name = "张三";
age = 14;
password = 114514;
}
};
void printp(persion p)
{
cout << "姓名:" << p.name << endl;
//cout << "年龄:" << p.age << endl; //保护权限内容,在类外不可以访问
//cout << "密码:" << p.password << endl; //私有权限内容,在类外不可以访问
// 函数同理,只要在类外,保护和私有权限就是不可以访问
}
int main()
{
persion p1;
p1.set();
p1.name = "李四";
//p1.age = 12; //保护权限内容,在类外不可以访问
//p1.password = 114515; //私有权限内容,在类外不可以访问
cout << "使用类内的函数试试" << endl;
p1.print();
cout << "使用类外的函数试试" << endl;
printp(p1);
system("pause");
return 0;
}
运行结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
使用类内的函数试试
姓名:李四
年龄:14
密码:114514
使用类外的函数试试
姓名:李四
请按任意键继续. . .
我们创建了一个类:
class persion
{
public:
string name;
protected:
int age;
private:
int password;
public:
void print()
{
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "密码:" << password << endl;
}
void set()
{
name = "张三";
age = 14;
password = 114514;
}
};
在这个类里面,name
是公共权限;password
是保护权限;password
是隐私权限。其中行为有两个,set
和print
。分别用于设置数据值和打印数据值。
int main()
{
persion p1;
p1.set();
p1.name = "李四";
//p1.age = 12;
//p1.password = 114515;
return 0;
}
这时候,如果我们在main
函数中试图给这三个类内数据赋值,则会发现age
和password
无法赋值(会报错)。报错内容如下:
成员 "persion::age" (已声明 所在行数:xx) 不可访问
成员 "persion::password" (已声明 所在行数:xx) 不可访问
这是因为,这两个类内属性已经被设置了保护和私有。所以在类外是不可以访问的。
但是如果我们调用类内的函数print
(用于打印数据):
int main()
{
persion p1;
p1.set();
p1.print();
return 0;
}
运行结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
姓名:张三
年龄:14
密码:114514
因为print
函数在类内,类内的函数可以访问类内的数据。如果我们再定义一个函数:
void printp (persion p);
int main()
{
persion p1;
p1.set();
printp(p1);
}
void printp (persion p)
{
cout << "姓名:" << name << endl;
//cout << "年龄:" << age << endl;
//cout << "密码:" << password << endl;
}
则会在我们在类外定义的函数内报错。这是因为这个函数不在类内,同样无法访问类内的数据。(所以上面注释掉了会报错的部分。)
当然,行为也是可以定义权限的。
class persion
{
public:
string name;
protected:
int age;
private:
int password;
public:
void print()
{
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "密码:" << password << endl;
}
protected:
void setage (int newage)
{
age = newage
return;
}
}
- 总结:
public
公共权限;protected
保护权限;private
私有权限。在类内,三者皆可读取。在类外,仅可以读取公共权限。
:-)