封装
一、封装的意义
封装是C++面向对象三大特征之一
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
封装的意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{ 访问权限: 属性 / 行为};
示例1:设计一个圆类
要求:求圆的周长
示例代码:
#define PI 3.14
//设计一个圆类,求圆的周长
//圆求周长的公式:2 * PI * 半径
//class 代表设计一个类
class Circle {
//访问权限
//公共权限
public:
//属性--圆的半径
int r;
//行为--获取圆的周长
double calculatezc() {
return 2 * PI * r;
}
};
int main() {
//通过圆类 创建具体的圆(对象)
//实例化 (通过一个类 创建一个对象的过程)
Circle c1;
c1.r = 10;
cout << "圆的周长为:" << c1.calculatezc() << endl; // 圆的周长为:62.8
system("pause");
return 0;
}
尝试自己写出示例2
示例2:设计一个学生类
要求:属性有姓名和学号,可以给姓名和学号赋值,可以打印学生的姓名和学号
//创建一个学生类
class Student {
public:
//属性
string m_name;
int m_studentid;
public:
//行为
// 赋值函数
void setname(string name) {
m_name = name;
}
void setid(int id) {
m_studentid = id;
}
void printinfo() {
cout << "姓名:" << m_name << endl;
cout << "学号:" << m_studentid << endl;
}
};
int main() {
//创建具体学生
class Student st1;
//赋值
st1.m_name = "小明";
st1.m_studentid = 123456;
//调用打印函数
st1.printinfo();
class Student st2;
st2.setname("小雪");
st2.setid(123457);
st2.printinfo();
system("pause");
return 0;
}
运行结果:
姓名:小明
学号:123456
姓名:小雪
学号:123457
请按任意键继续. . .
专业术语:
- 类中的属性和行为——统称为成员
- 属性——成员属性、成员变量
- 行为——成员函数、成员方法
封装的意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
- 公共权限
public
—— 类内可以访问 类外可以访问 - 保护权限
protected
—— 类内可以访问 类外不可以访问 - 私有权限
private
—— 类内可以访问 类外不可以访问
示例:
//三种访问权限
//公共权限 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 = 123546;
}
};
int main() {
//实例化具体对象
Person p1;
//类外只能调用public访问权限内的
p1.func();
p1.m_name = "李四";
cout << p1.m_name << endl; //输出:李四
system("pause");
return 0;
}
二、struct
和class
的区别
在C++中struct
和class
唯一的区别就在于默认的访问权限不同
区别:
struct
默认权限为公开class
默认权限为私有
示例:
class C1 {
int m_a;
};
struct C2 {
int m_a;
};
int main() {
//struct和class的区别
//struct 默认权限是 公共 public
//class 默认权限是 私有 private
C1 c1;
//c1.m_a = 10; 默认私有权限,报错
C2 c2;
c2.m_a = 123;
cout << c2.m_a << endl; //输出:123
system("pause");
return 0;
}