类和对象封装的知识结构:
1.封装的意义
封装是C++面向对象三大特性之一
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
封装中的访问权限:
类在设计时,可以把属性和行为放在不同的权限下加以控制
访问权限有三种:
- 公共权限:public(成员类内可以访问,类外也可以访问)
- 保护权限:protected(成员类内可以访问,类外不可以访问。但是发生继承关系时,子类可以访问父类的保护内容)
- 私有权限:private(成员类内可以访问,类外不可以访问。即使发生继承关系,子类
也无法访问父类的保护内容)
示例:
class Person
{
public:
//公共权限
string m_Name;
protected:
//保护权限
string m_Car;
private:
//私有权限
int m_Password;
public:
void func()
{
//成员类内可以访问
m_Name = "jack";
m_Car = "MB";
m_Password = 12345;
}
};
class Son :Person
{
public:
void func2()
{
cout << m_Car << endl;//发生继承关系时,子类可以访问父类的保护内容
cout << m_Name << endl;//公共属性类型也可访问
cout << m_Password << endl; //报错,因为私有属性在类外无法访问
}
};
2. struct和class区别
在C++中struct和class唯一的区别就在于默认的访问权限不同
区别:
- struct默认权限为公有
- class默认权限为私有
示例:
class C1
{
int m_A=100; //默认权限是私有
};
struct C2
{
int m_A=100; //默认权限是公有
};
int main()
{
C2 c2;
cout << c2.m_A << endl; //结构体中的属性可以正常访问
C1 c1;
cout << c1.m_A << endl; //报错
system("pause");
return 0;
}
3. 成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
示例:
class Person
{
public:
//设置姓名
void setName(string name)
{
m_Name = name;
}
//获取姓名
string getName()
{
return m_Name;
}
//获取年龄
int getAge()
{
return m_Age;
}
//设置年龄
void setAge(int age) // 可以检测数据的有效性
{
if (age < 0 || age>150)
{
m_Age = 0;
return;
}
m_Age = age;
}
//设置情人
void setLover(string lover)
{
m_Lover = lover;
}
private:
string m_Name; //姓名 可读可写
int m_Age; // 年龄 可读可写
string m_Lover; //情人 只写
};
注:如果成员属性设置为公有,那么就无法控制其读写状态,因为公有权限代表在类外也可以访问。那成员设置成私有就可以控制成员的读写状态了吗?私有成员不是在类外无法进行访问吗?可能大家会有这样的疑问。确实,类的私有成员在类外是无法访问的,所以需要在类中提供一些公共的接口,来实现成员灵活的读写。举个简单的例子,如果希望类中的某个属性是可读而不可写的,那就可以在类内实现get_property的接口,而不去实现set_property的接口,这样这个属性的值在类外就能通过get_property读到,而由于该属性是私有,且没有提供set_property的接口,所以不可写。