众所周知,C++是一门面向对象的语言,相对于面向过程的C语言,面向对象有时候有自己的优势,今天就讲一下面向对象的三大特性之一——封装。
面向对象的思想当中,将所有事物抽象为一个个的类,每个类有自己的属性和行为,比如人类,可以理解为人类的属性有头发、眼睛、四肢等等,行为有走路、唱歌等等等。这种思想在编程当中有时候很方便。
封装的意义1:在设计类的时候,属性和行为写在一起,表现事物。
语法: class 类名{ 访问权限:属性 / 行为 };
示例:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号。
//学生类
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;
}
封装的意义2:类在设计时,可以把属性和行为放在不同的权限下,加以控制。
访问权限有三种:
在C++中 struct和class唯一的区别就在于 默认的访问权限不同
区别:
通常我们将成员属性设置为私有,这样有两个优点:
优点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) {
cout << "error!" << endl;
return;
}
m_Age = age;
}
private:
string m_Name; //可读可写 姓名
int m_Age; //只读 年龄
};
int main() {
Person p;
//姓名设置
p.setName("张三");
cout << "姓名:" << p.getName() << endl;
//年龄设置
p.setAge(50);
cout << "年龄: " << p.getAge() << endl;
system("pause");
return 0;
}
在这个代码里面,姓名和年龄都是私有属性,类外是不可以访问的,但是类里面的接口函数是公共权限,可以通过这些函数接口来访问,这样的一个好处是这些属性不会轻易被非法修改,只能通过接口函数来间接读或写,提高了安全性。
好了,这里只是初步的介绍了面向对象的封装,后面将会深入研究面向对象的其他特性。