封装是什么
在提到封装时,我们先看一个小故事
在一个古老的小镇上,有一位名叫亨利的木匠,他以精湛的手艺和周到的服务而闻名。亨利对他的木工工具情有独钟,他的每一个工具箱都精心打造,装满了他用来制作家具和雕刻艺术品的工具。
亨利的工具箱是他的封装体,里面包含着锋利的刨刀、精准的锤子、各种尺子和锯子。这些工具都被亨利当作宝贝般小心翼翼地保护着。没有人能直接触及他的工具,因为他知道工具在精心使用和保护下才能保持最佳状态。
一天,镇上的一位年轻学徒,小约翰,来向亨利学艺。亨利非常乐意教授他木工技能,但是他首先要求小约翰学会尊重和保护工具。亨利指导小约翰如何正确地使用每一种工具,如何在使用后清洁和妥善保管它们。亨利告诉小约翰,只有当你理解和尊重工具的工作方式,才能真正成为一个优秀的木匠。
随着时间的推移,小约翰学会了亨利的教诲,成为一名出色的木匠。他继承了亨利的传统,将对工具的尊重和封装作为他制作精美家具的基石。每当有人问起他的成功秘诀时,小约翰总是会说:“封装并不仅仅是将工具放进工具箱,它更是一种态度和对工作的尊重。”
这个小故事通过木匠与工具箱之间的关系,生动地展示了封装在面向对象编程中的重要性和意义:保护和尊重数据和操作的封装体,以确保代码的可维护性、安全性和效率。
在c++中,封装是面向对象编程中的一个重要概念,它指的是将数据(成员变量)和操作数据的方法(成员函数)封装在一个类(或者结构体)中,并对外部隐藏对象的工作原理。这样可以保证数据的安全性,防止外部直接访问和修改对象的内部状态,而是通过类提供的接口进行操作。
封装的意义
1.将属性和行为作为一个整体,表现生活中的事物
2.权限控制属性和行为
让我们来举一个简单的封装案例:
假设我们要设计一个表示学生的类 Student
,其中包括学生的姓名和年龄。我们希望封装这些信息,并提供方法来设置和获取学生的姓名和年龄。
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
string name;
int age;
public:
// 设置学生姓名的方法
void setName(string n) {
name = n;
}
// 获取学生姓名的方法
string getName() {
return name;
}
// 设置学生年龄的方法
void setAge(int a) {
if (a >= 0) {
age = a;
}
else {
cout << "Age cannot be negative. Setting age to 0.\n";
age = 0;
}
}
// 获取学生年龄的方法
int getAge() {
return age;
}
};
int main() {
// 创建一个学生对象
Student student1;
// 设置学生的姓名和年龄
student1.setName("Alice");
student1.setAge(20);
// 获取学生的姓名和年龄并输出
cout << "Student's name: " << student1.getName() << "\n";
cout << "Student's age: " << student1.getAge() << "\n";
return 0;
}
在这个例子中,类 Student
封装了学生的姓名(name
)和年龄(age
)。这些成员变量被声明为私有(private
),外部代码无法直接访问它们。相反,类提供了公共的成员函数(setName()
、getName()
、setAge()
、getAge()
),这些函数允许外部代码通过调用它们来间接访问和操作学生的姓名和年龄。
通过这种封装,我们确保了数据的安全性和一致性,防止外部代码直接修改学生对象的内部状态,同时提供了一种有条理的方式来管理和访问这些数据。
结果如下:
Class和struct区别
在 C++ 中,class
和 struct
在语法上有一些差异,但它们的主要区别在于默认的访问权限。
- 访问权限:
- class:默认的访问权限是
private
,意味着类的成员(包括成员变量和成员函数)如果没有显式指定访问权限,都将被视为私有成员。 - struct:默认的访问权限是
public
,这意味着结构体的成员如果没有显式指定访问权限,都将被视为公共成员。
- class:默认的访问权限是
举个简单的例子来展示这两者之间的区别:
// 使用 class 定义一个类
class MyClass {
int privateMember; // 默认是 private
public:
void publicMethod() {
// 可以在类的外部访问这个公共方法
}
};
// 使用 struct 定义一个结构体
struct MyStruct {
int publicMember; // 默认是 public
private:
void privateMethod() {
// 在结构体中可以有私有方法
}
};
-
继承:
class
和struct
在继承方面没有区别,都支持单继承和多态性。
-
使用习惯:
- 一般来说,
class
更常用于较复杂的对象模型,因为它默认的私有成员可以帮助隐藏实现细节,提供更好的封装性。 struct
则更多用于轻量级的数据结构,如只包含少量数据成员,且不需要额外的封装。
- 一般来说,
综上所述,class
和 struct
的最主要区别在于默认的成员访问权限。在实际使用中,可以根据具体的设计需求来选择合适的关键字,以便于更好地表达和组织代码结构。