【c++随笔11】面向对象和封装
-
C++ 是基于面向对象的程序,面向对象有三大特性 ------ 封装、继承、多态。
当谈到C++编程时,面向对象编程(OOP:Object-Oriented Programming)和封装是两个重要的概念。通过面向对象编程,我们可以更好地组织和管理代码,并且提高代码的可维护性和可重用性。而封装允许我们隐藏数据的内部实现细节,并通过公共接口来访问和操作数据。本教程将深入介绍C++中的面向对象编程和封装的概念、语法和实际应用。
一、什么是面向对象编程?
1、面向对象以对象作为程序的基本单元
面向对象编程是一种编程范式,它以对象作为程序的基本单元,将数据和操作捆绑在一起。每个对象都是一个独立的实体,具有自己的特征(数据成员)和行为(成员函数)。
面向对象编程的核心思想是通过定义类来创建对象,从而模拟现实世界中的事物和关系。
2、类和对象
在C++中,我们使用class关键字定义一个类,描述了对象的特征和行为。类包含数据成员和成员函数,用于存储和操作对象的数据。例如,下面是一个简单的类定义:
cpp
class MyClass {
private:
int myData; // 私有数据成员
public:
void setMyData(int value) {
myData = value;
}
int getMyData() const {
return myData;
}
};
通过类定义,我们可以创建一个或多个对象。对象是类的实例,它具有类中定义的数据成员和成员函数。以下是如何创建和使用对象的示例:
cpp
MyClass obj1; // 创建一个对象
obj1.setMyData(10); // 调用对象的成员函数
int data = obj1.getMyData(); // 调用对象的成员函数
3、特性继承和多态性
面向对象编程还包括特性继承和多态性的概念。
- 特性继承:
通过继承,一个类可以获得另一个类的特性(数据成员和成员函数),从而实现代码的重用。派生类继承了基类的特征,并可以添加自己的特征。例如:
cpp
class BaseClass {
public:
void baseFunction() {
// 基类函数实现
}
};
class DerivedClass : public BaseClass {
public:
void derivedFunction() {
// 派生类函数实现
}
};
- 多态性:
多态性允许以不同的方式处理具有相同基类的对象。通过使用虚函数和指针/引用,我们可以在运行时确定调用的是哪个类的函数。例如:
cpp
class BaseClass {
public:
virtual void print() {
cout << "Base Class" << endl;
}
};
class DerivedClass : public BaseClass {
public:
void print() override {
cout << "Derived Class" << endl;
}
};
int main() {
BaseClass* ptr = new DerivedClass(); // 使用基类指针指向派生类对象
ptr->print(); // 输出 "Derived Class"
}
二、什么是封装?
封装是面向对象编程的一个重要概念,它将数据和对数据的操作封装在一个类中。通过将数据成员声明为私有,封装确保数据只能通过类提供的公共接口进行访问和操作。封装提供了一种机制,用于隐藏数据的内部细节,从而增加代码的安全性、可维护性和可重用性。
1、类的定义和访问修饰符
在C++中,我们使用class关键字来定义一个类。类包含了数据成员和成员函数,用于描述对象的特征和行为。下面是一个示例:
cpp
class MyClass {
private:
// 私有数据成员
public:
// 公共成员函数
};
在类定义中,我们可以使用访问修饰符来控制成员的可访问性:
public:公共成员可以在类外部访问,也可以在类内部访问。
private:私有成员只能在类内部访问,对外部是不可见的。
protected:受保护成员类似于私有成员,但可以被派生类访问。
2、封装数据和公共接口
封装的核心是将数据成员声明为私有,并通过公共成员函数提供对数据的访问和操作。例如,在类中,我们可以这样定义数据成员和成员函数:
cpp
class MyClass {
private:
int data; // 私有数据成员
public:
void setData(int value) {
// 对数据进行验证和处理
// ...
data = value;
}
int getData() const {
return data;
}
};
在上面的示例中,data被声明为私有数据成员。然后,我们通过setData和getData两个公共成员函数来提供对数据的设置和获取。这样,外部代码只能通过公共接口来访问数据,无法直接访问私有数据。
3、数据验证和处理
封装还允许我们在公共接口内部对数据进行验证和处理。例如,在setData函数中,我们可以添加一些逻辑来确保数据的有效性。这可以包括范围检查、类型检查、数据转换等。以下是一个简单的示例:
cpp
void setData(int value) {
if (value > 0) {
data = value;
} else {
// 数据不合法,进行错误处理
// ...
}
}
通过在公共接口内部进行数据验证和处理,我们可以确保数据的有效性和一致性,增强代码的健壮性。
4、封装的优点
封装在C++编程中具有许多优点:
安全性:封装隐藏了数据的具体细节,防止外部代码直接访问和修改数据,提高了数据的安全性。
可维护性:封装将相关的数据和操作组织在一起,代码更易于理解、修改和维护。
可重用性:封装创建了独立的模块,使其可以在不同的程序中多次使用,提高了代码的可重用性。
抽象性:封装通过公共接口提供了抽象层级,外部代码只需关注接口而不必了解内部实现细节,提供了更高层次的抽象。
5、实际应用示例
假设我们正在开发一个学生管理系统。我们可以使用封装来定义Student类,包含学生的姓名、年龄等个人信息。以下是一个简化的示例:
cpp
class Student {
private:
string name;
int age;
public:
void setName(const string& newName) {
name = newName;
}
string getName() const {
return name;
}
void setAge(int newAge) {
if (newAge > 0 && newAge <= 100) {
age = newAge;
} else {
// 年龄不合法,进行错误处理
// ...
}
}
int getAge() const {
return age;
}
};
通过封装,我们可以确保学生的姓名和年龄数据被安全地存储在类的私有成员中。然后,我们提供公共成员函数来设置和获取这些数据,以便外部代码可以通过这些接口与学生对象进行交互。
这是一个简单示例,但它展示了封装在实际应用中的价值。通过封装,我们可以实现更安全、可维护和可扩展的代码,提高软件开发的效率和质量。
三、再次理解
1、再次理解封装
C++ 是基于面向对象的程序,面向对象有三大特性 ------ 封装、继承、多态。
C++ 通过类,将一个对象的属性与行为结合在一起,使其更符合人们对于一件事物的认知,将属于该对象的所有东西都打包在一起。通过访问限定符选择性地将其部分功能开放出来与其他对象进行交互,而对于对象内部的一些实现细节,外部用户不需要知道,也没必要知道,就算知道了有些情况下也没用,反而增加了使用或维护的难度,导致整个事情变得复杂化。
封装是为了更好的管理,我想让你访问的我定义成公有,不想给你访问的我定义成私有或者保护。
1.1、封装的意义和本质
封装是一种更好的严格管理,不封装是一种自由管理。
封装的本质是一种管理。
2、再次理解面向对象
实际上,我们写的东西就是对现实进行映射,我们定义类就是对一类事情的描述。
类就是对现实世界中一类事物的抽象类别的描述,类可以实例化出很多对象,