「C/C++」C++三大特性之封装、继承、多态(大致了解)

devtools/2024/10/25 12:04:03/

在这里插入图片描述

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

    • C++三大特性详解:封装、继承与多态
      • 封装(Encapsulation)
      • 继承(Inheritance)
      • 多态(Polymorphism)
      • 总结

C++三大特性详解:封装、继承与多态

C++是一种功能强大的编程语言,它以其面向对象编程(OOP)的特性而著称。OOP的三大核心特性——封装、继承和多态,为开发高效、可维护的代码提供了基础。本文将详细讲解这三个特性,并配以相应的代码示例。

封装(Encapsulation)

封装是面向对象编程的一个基本特性,它允许我们将对象的实现细节隐藏在对象的外部,只公开一些必要的接口供使用者进行访问。在C++中,封装主要是通过类(class)来实现的。

封装的意义

封装的意义在于保护对象的内部数据,避免外界的干扰和误用,同时提高代码的可读性、可维护性和安全性。通过封装,可以将数据成员定义为私有(private),只能通过公有(public)成员函数进行访问和修改。

示例代码

#include <iostream>
using namespace std;class Student {
private:string name;int age;float grade;public:// 构造函数Student(string n, int a, float g) {name = n;age = a;grade = g;}// 获取学生姓名string getName() {return name;}// 设置学生姓名void setName(string n) {name = n;}// 获取学生年龄int getAge() {return age;}// 设置学生年龄void setAge(int a) {age = a;}// 获取学生成绩float getGrade() {return grade;}// 设置学生成绩void setGrade(float g) {grade = g;}
};int main() {Student s("张三", 20, 90.5);cout << "学生姓名: " << s.getName() << endl;cout << "学生年龄: " << s.getAge() << endl;cout << "学生成绩: " << s.getGrade() << endl;s.setName("李四");s.setAge(21);s.setGrade(95.0);cout << "更新后的学生姓名: " << s.getName() << endl;cout << "更新后的学生年龄: " << s.getAge() << endl;cout << "更新后的学生成绩: " << s.getGrade() << endl;return 0;
}

对象的初始化和清理

对象的初始化和清理是C++编程中两个非常重要的安全问题。C++通过构造函数和析构函数来解决这些问题。构造函数在对象创建时自动调用,用于初始化对象;析构函数在对象销毁前自动调用,用于执行清理工作。

示例代码

#include <iostream>
using namespace std;class Person {
public:// 构造函数Person() {cout << "Person的构造函数调用" << endl;}// 析构函数~Person() {cout << "Person的析构函数调用" << endl;}
};void test01() {Person p;
}int main() {test01();system("pause");return 0;
}

对象模型和this指针

在C++中,对象模型是将数据和操作数据的函数绑定在一起的一种机制。this指针是一个隐含在每个非静态成员函数中的指针,它指向被调用函数的所属对象。

示例代码

#include <iostream>
using namespace std;class Person {
public:Person(int a) {this->age = a;}Person& addAge(Person& p) {this->age += p.age;return *this;}int getAge() {return age;}private:int age;
};void test01() {Person p1(10);Person p2(20);p1.addAge(p2).addAge(p2).addAge(p2);cout << "p1的年龄: " << p1.getAge() << endl;
}int main() {test01();return 0;
}

友元(Friend)

友元函数是一种特殊的成员函数,它可以访问类的私有和保护成员。通过将函数声明为当前类的友元函数,该函数就可以访问当前类的私有和保护成员。

示例代码

#include <iostream>
using namespace std;class Student {
private:int age;double height;float chinese;float english;float math;public:Student(float c, float e, float m) {chinese = c;english = e;math = m;}friend void output(Student &s);
};void output(Student &s) {cout << "Output: " << s.chinese << "--" << s.english << "--" << s.math << endl;
}int main() {Student s(78.5, 88.2, 95.0);output(s);system("pause");return 0;
}

继承(Inheritance)

继承是面向对象编程中一种基本的思想,它允许我们创建一个新的子类,继承现有父类的属性和方法。子类可以添加新的属性和方法,以实现更强大的功能,还可以重写父类中的方法,以实现不同的行为。

继承的方式

C++中的继承方式有三种:公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。

示例代码

#include <iostream>
using namespace std;// 基类
class Animal {
public:void eat() {cout << "Eating..." << endl;}void sleep() {cout << "Sleeping..." << endl;}
};// 派生类
class Dog : public Animal {
public:void bark() {cout << "Barking..." << endl;}
};int main() {Dog d;d.eat();d.sleep();d.bark();return 0;
}

多态(Polymorphism)

多态是面向对象编程中的一种特性,它允许我们通过父类的指针或引用来调用子类的成员函数,从而实现动态绑定。多态性可以分为编译时多态和运行时多态。C++中的多态性主要通过虚函数(virtual function)来实现。

示例代码

#include <iostream>
using namespace std;// 基类
class Shape {
public:virtual void draw() {cout << "Drawing Shape" << endl;}
};// 派生类
class Circle : public Shape {
public:void draw() override {cout << "Drawing Circle" << endl;}
};// 派生类
class Rectangle : public Shape {
public:void draw() override {cout << "Drawing Rectangle" << endl;}
};int main() {Shape *s1 = new Circle();Shape *s2 = new Rectangle();s1->draw(); // 输出: Drawing Circles2->draw(); // 输出: Drawing Rectangledelete s1;delete s2;return 0;
}

总结

封装、继承和多态是C++面向对象编程的三大核心特性。封装提高了代码的可读性、可维护性和安全性;继承促进了代码的重用和扩展;多态则实现了动态绑定,增强了程序的灵活性。通过合理利用这些特性,我们可以开发出高效、可维护的C++程序。


在这里插入图片描述


http://www.ppmy.cn/devtools/128673.html

相关文章

实时面部情绪识别(一)

文章目录 实时面部情绪识别&#xff08;一&#xff09;一、linux一、Tensorflow 安装1、虚拟环境2、安装cudnn和cuda2、校验依赖 二、复现1、依赖2、运行 三、常见问题1、cant open camera by index 二、Windows一、环境1、虚拟环境2、设置镜像&#xff08;可选&#xff09;3、…

【无标题】如何使用yolo-v8 实现自定义目标检测

如何使用yolo-v8 实现自定义目标检测 训练数据集准备搭建环境安装anaconda配置python虚拟环境安装yolo-v8以及labelimg图片标注工具 编写配置文件和训练脚本文件编写yaml配置文件(文件名为dataset.yaml)编写模型训练代码&#xff08;文件名称为yolotrain.py&#xff09;运行训练…

CICD 持续集成与持续交付

目录 一 CICD是什么 1.1 持续集成&#xff08;Continuous Integration&#xff09; 1.2 持续部署&#xff08;Continuous Deployment&#xff09; 1.3 持续交付&#xff08;Continuous Delivery&#xff09; 二 git工具使用 2.1 git简介 2.2 git 工作流程 三 部署git …

数理统计(第三章:假设检验的基本概念)

目录 假设检验&#xff1a;对母体的分布或者母体分布中的未知参数提出某种假设&#xff0c;由子样推断是否接受该种假设 假设检验的基本概念&#xff08;概率性质的反证法&#xff09; 假设检验&#xff1a;对母体的分布或者母体分布中的未知参数提出某种假设&#xff0c;由子…

NX二次开发---在保存时导出PDF并打开

该工程为在保存时执行开发的功能,函数入口点ufput。其他还有新建、打开、另存等都可以加入开发的操作,具体看UF_EXIT下的介绍。 用户出口是一个可选特性,允许你在NX中某些预定义的位置(或出口)自动运行Open C API程序。如果你进入其中一个出口,NX会检查你是否定义了指向Op…

Flutter按钮控件(六)

1、常见按钮 import package:flutter/material.dart;void main() {runApp(const MaterialApp(home: MyHomePage(title: "按钮控件"),)); }class MyHomePage extends StatelessWidget {const MyHomePage({super.key, required this.title});final String title;overr…

简述 C# 二维数据集合 List 的创建、遍历、修改、输出

简述 C# 二维数据集合 List 的创建、遍历、修改、输出 1、为什么要使用列表 List2、引入命名空间3、声明一维列表 List4、声明创建一个二维列表 List&#xff0c;数据类型 int5、 简单访问二维 List 元素或值6、遍历二维列表&#xff0c;控制台输出7、遍历二维列表&#xff0c;…

vscode离线状态ssh连接不断输入密码登不上:配置commit_id

如题&#xff0c;vscode在一个离线服务器上&#xff0c;通过remote-ssh登录远程服务器&#xff0c;不断弹出密码框&#xff0c;总是进不去&#xff0c;后来了解到主要是不同vscode版本需要下载对应抑制commit-id的vscode-server-linux-x64.tar.gz包。 1&#xff09;vscode, 点…