C++面向对象编程解析

文章目录

1. 概述

2. 作用解析

3. 概念解析

1. 类和对象

2. 封装(Encapsulation)

3. 继承(Inheritance)

4. 多态(Polymorphism)


1. 概述

C++ 是在 C 语言的基础上增加了面向对象编程(OOP)特性的编程语言。面向对象编程是一种编程范式,通过将程序组织成对象的集合,这些对象包含数据和行为,从而提高代码的可重用性、可维护性和可扩展性。

面向对象编程(OOP)的基本概念

类(Class)

  • 类是对一类对象的抽象描述,定义了对象的属性(数据)和行为(方法)。
  • 类是面向对象编程的基本单元,用来封装数据和操作数据的方法。

对象(Object)

  • 对象是类的实例,通过类定义的数据和方法来实现具体的实体。
  • 每个对象都有自己的属性值,称为对象的状态。

封装(Encapsulation)

  • 封装是将数据和操作数据的方法捆绑在一起,对外隐藏内部实现细节,只提供对外访问接口。
  • 封装提高了数据的安全性和代码的可维护性。

继承(Inheritance)

  • 继承是从已有类创建新类的机制,新类继承了已有类的属性和方法,可以扩展或修改这些属性和方法。
  • 继承提高了代码的复用性和可扩展性。

多态(Polymorphism)

  • 多态是同一操作作用于不同对象,可以有不同的解释和实现。
  • 多态通过接口和继承实现,提高了代码的灵活性和可扩展性。

2. 作用解析

理解面向对象编程(OOP)的概念及其在实际开发中的应用是一个逐步深入的过程。下面通过更详细的解释和具体示例来说明为什么在 C++ 中使用类和对象是有用的。

接下来用宠物来举例:

类和对象的意义

  1. 代码组织和模块化

    • 类将相关的数据和操作封装在一起,使代码更有组织和模块化。这使得代码更易于理解和维护。
    • 例如,Dog 类封装了狗的属性(如名字和年龄)和行为(如叫声)。
  2. 代码复用

    • 通过继承,新的类可以复用现有类的代码,减少重复代码,提高开发效率。
    • 例如,Dog 类可以继承自 Animal 类,复用 Animal 类的 eat 方法,同时添加 Dog 类特有的 bark 方法。
  3. 数据封装和隐藏

    • 通过类的访问控制,数据和方法可以被隐藏,只有通过类的公共接口才能访问,从而提高安全性。
    • 例如,Dog 类可以将名字和年龄设置为私有属性,只能通过公共方法 setNamegetName 进行访问和修改。
  4. 多态性

    • 多态允许不同类的对象通过同一接口进行操作,提高了代码的灵活性和扩展性。
    • 例如,Animal 类定义了一个虚函数 makeSound,而 DogCat 类可以分别实现自己的 makeSound 方法。

假设我们在开发一个宠物管理系统,我们希望系统能够管理不同类型的宠物,并且能够让它们发出声音。使用面向对象编程,我们可以设计以下类:

定义基本的 Animal

#include <iostream>
#include <string>
using namespace std;class Animal {
public:virtual void makeSound() {cout << "Some generic animal sound" << endl;}
};

定义具体的 DogCat

class Dog : public Animal {
public:void makeSound() override {cout << "Woof!" << endl;}
};class Cat : public Animal {
public:void makeSound() override {cout << "Meow!" << endl;}
};

使用这些类

int main() {Animal* pets[2];pets[0] = new Dog();pets[1] = new Cat();for (int i = 0; i < 2; i++) {pets[i]->makeSound();}for (int i = 0; i < 2; i++) {delete pets[i];}return 0;
}
  • 类的定义

    • Animal 类是一个基类,定义了一个虚函数 makeSound
    • DogCat 类继承自 Animal 类,并分别实现了 makeSound 方法。
  • 使用这些类

    • main 函数中,我们创建了一个 Animal 类指针的数组,pets
    • 我们将 DogCat 对象的指针存储在 pets 数组中。
    • 通过循环,我们调用每个对象的 makeSound 方法。由于多态性,调用的具体方法取决于对象的实际类型。
    • 最后,我们释放分配的内存。
  • 代码复用:通过继承,DogCat 复用了 Animal 类中的代码。
  • 灵活性:我们可以很容易地添加新的宠物类型,只需要定义新的类继承自 Animal 类并实现 makeSound 方法。
  • 可扩展性:我们可以在不改变现有代码的基础上,扩展系统的功能。

 

3. 概念解析

面向对象编程(OOP)的四大基本概念

  1. 类和对象(Class and Object)
  2. 封装(Encapsulation)
  3. 继承(Inheritance)
  4. 多态(Polymorphism)

接下来对每个概念进行解释

1. 类和对象

类(Class)

  • 类是对一类对象的抽象描述,定义了对象的属性和行为。
  • 类是面向对象编程的基本单元,用来封装数据和操作数据的方法。

对象(Object)

  • 对象是类的实例,通过类定义的数据和方法来实现具体的实体。
  • 每个对象都有自己的属性值,称为对象的状态。
#include <iostream>
using namespace std;// 定义一个 Dog 类
class Dog {
public:string name;  // 属性:狗的名字int age;      // 属性:狗的年龄// 方法:狗叫void bark() {cout << "Woof!" << endl;}
};int main() {Dog myDog;       // 创建对象 myDogmyDog.name = "Buddy";  // 设置对象的属性myDog.age = 3;myDog.bark();    // 调用对象的方法return 0;
}
  • 类(Class)Dog 类定义了狗的属性(名字和年龄)和行为(叫声)。
  • 对象(Object)myDogDog 类的一个实例,代表一只具体的狗。
  • 属性(Attribute)nameageDog 类的属性,分别表示狗的名字和年龄。
  • 方法(Method)barkDog 类的方法,表示狗的行为。

2. 封装(Encapsulation)

  • 封装是将数据和操作数据的方法捆绑在一起,对外隐藏内部实现细节,只提供对外访问接口。
  • 封装提高了数据的安全性和代码的可维护性。
#include <iostream>
using namespace std;// 定义一个 Dog 类
class Dog {
private:string name;  // 私有属性:狗的名字int age;      // 私有属性:狗的年龄public:// 设置狗的名字void setName(string n) {name = n;}// 获取狗的名字string getName() {return name;}// 设置狗的年龄void setAge(int a) {age = a;}// 获取狗的年龄int getAge() {return age;}// 方法:狗叫void bark() {cout << "Woof!" << endl;}
};int main() {Dog myDog;myDog.setName("Buddy");myDog.setAge(3);cout << "Name: " << myDog.getName() << endl;cout << "Age: " << myDog.getAge() << endl;myDog.bark();return 0;
}
  • 封装(Encapsulation):通过将属性 nameage 设置为私有,并提供公共的 setNamegetNamesetAgegetAge 方法来访问这些属性,确保了数据的安全性和完整性。
  • 数据隐藏:外部代码不能直接访问或修改私有属性,只能通过公共方法进行操作,从而保护了数据的安全。

3. 继承(Inheritance)

  • 继承是从已有类创建新类的机制,新类继承了已有类的属性和方法,可以扩展或修改这些属性和方法。
  • 继承提高了代码的复用性和可扩展性。
#include <iostream>
using namespace std;// 定义一个基类 Animal
class Animal {
public:// 基类的方法:吃void eat() {cout << "Eating..." << endl;}
};// 定义一个派生类 Dog,继承自 Animal
class Dog : public Animal {
public:// 派生类的方法:狗叫void bark() {cout << "Woof!" << endl;}
};int main() {Dog myDog;myDog.eat();  // 继承自 Animal 类的方法myDog.bark(); // Dog 类自己的方法return 0;
}
  • 继承(Inheritance)Dog 类继承自 Animal 类,复用了 Animal 类的 eat 方法,并添加了自己的 bark 方法。
  • 代码复用:通过继承,Dog 类不需要重新定义 eat 方法,减少了代码重复,提高了代码复用性。

4. 多态(Polymorphism)

  • 多态是同一操作作用于不同对象,可以有不同的解释和实现。
  • 多态通过接口和继承实现,提高了代码的灵活性和扩展性。
#include <iostream>
using namespace std;// 定义一个基类 Animal
class Animal {
public:// 虚函数:发出声音virtual void makeSound() {cout << "Some generic animal sound" << endl;}
};// 定义一个派生类 Dog,继承自 Animal
class Dog : public Animal {
public:// 重写基类的虚函数void makeSound() override {cout << "Woof!" << endl;}
};// 定义一个派生类 Cat,继承自 Animal
class Cat : public Animal {
public:// 重写基类的虚函数void makeSound() override {cout << "Meow!" << endl;}
};int main() {Animal* pet1 = new Dog(); // 创建一个 Dog 对象并赋值给 Animal 指针Animal* pet2 = new Cat(); // 创建一个 Cat 对象并赋值给 Animal 指针pet1->makeSound(); // 输出: Woof! 调用 Dog 类的 makeSound 方法pet2->makeSound(); // 输出: Meow! 调用 Cat 类的 makeSound 方法delete pet1;delete pet2;return 0;
}
  • 多态(Polymorphism):通过基类指针 Animal* 可以指向不同派生类的对象,并调用它们各自的 makeSound 方法。
  • 虚函数(Virtual Function)makeSoundAnimal 类的虚函数,派生类 DogCat 分别重写了这个函数。
  • 动态绑定:在运行时决定调用哪个类的 makeSound 方法,实现了多态。

理解面向对象编程(OOP)的概念及其在实际开发中的应用是一个逐步深入的过程。这个示例只是简单的解析,之后会在专栏中更新更详细的解析。

C++ 面向对象编程——类 & 对象-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【管理咨询宝藏148】顶级咨询公司大型线下连锁门店客户生命周期规划方案

【管理咨询宝藏148】顶级咨询公司大型线下连锁门店客户生命周期规划方案 【格式】PDF版本 【关键词】零售数字化、客户生命周期、客户画像 【核心观点】 - 在多年的行业研究积累过程中&#xff0c;将每个行业中具有典型代表性的用户维度进行了总结。本项目选择用户服务的标杆企…

视频监控管理平台LntonAIServer智能视频监控平台在工业排污检测中的应用

随着工业化的不断发展&#xff0c;环境污染问题日益严重。为了保护生态环境&#xff0c;各国政府纷纷出台相关政策&#xff0c;对工业排污进行严格监管。然而&#xff0c;传统的排污检测方法往往耗时耗力&#xff0c;且难以实现实时监控。因此&#xff0c;如何提高工业排污检测…

Graph-RAG:知识图谱与大模型的融合

在数字化的浪潮中&#xff0c;知识的累积已非线性增长&#xff0c;以指数级的速度膨胀。我们站在一个信息过载的十字路口&#xff0c;迫切需要一种能力&#xff0c;能够穿透数据的迷雾&#xff0c;捕捉知识的精髓。本文将揭示 Graph-RAG 的神秘面纱&#xff0c;这是一种突破传统…

FBMM: Making Memory Management Extensible With Filesystems——论文泛读

ATC 2024 Paper 论文阅读笔记整理 问题 CXL这样的新内存技术实现了多种内存配置&#xff0c;如分层内存、远内存和内存处理。为了支持这些新的硬件配置&#xff0c;需要对操作系统进行大量修改。例如&#xff0c;Meta的TPP内核补丁对NUMA和页面回收策略进行了更改&#xff0c…

PMP证书含金量高吗?值得考吗?

值啊&#xff0c;我考过了&#xff0c;PMP 是项目管理岗位的敲门砖&#xff0c;很多企业都写明了持有PMP 证书的优先&#xff0c;而且学完这个知识体系&#xff0c;对我的能力提升确实有帮助&#xff0c;还是值得的。 一、为什么值得 这个证书就是基础知识&#xff0c;项目管…

系统架构设计师 - 知识产权与标准化

知识产权与标准化 知识产权与标准化&#xff08;3分&#xff09;保护范围与对象 ★ ★ ★ ★法律法规 保护期限 ★ ★知识产权人确定 ★ ★ ★ ★侵权判断 ★ ★ ★ ★标准化&#xff08;了解&#xff09;★标准的分类标准的编号 大家好呀&#xff01;我是小笙&#xff0c;本章…

数据库实验:数据库安全性

一、实验目的&#xff1a; 1、掌握SQL SERVER的身份验证方式。 2、掌握SQL SERVER的权限。 3、掌握给数据库的用户和角色赋予权限和从用户和角色收回权限。 4、掌握GRANT&#xff0c;REVOKE&#xff0c;DENY的用法。 二、实验内容&#xff1a; 1、将SQL SERVER服务器的安全…

爬虫-通过几个例子来说明并发以及多线程

并发 什么是并发&#xff1f;并发&#xff0c;在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机上运行&#xff0c;但任一个时刻点上只有一个程序在处理机上运行。 嗯&#xff0c;字认识&#…

滞回比较器工作原理,应用,TINA仿真

滞回比较器 滞回比较器的主要应用是增加滞回控制&#xff0c;让其对微小的变化不那么敏感&#xff0c;增强抗干扰能力&#xff0c;避免由噪声引起的不稳定状态&#xff0c;通常用于噪声环境下的阈值检测以及信号调理。根据不同需求&#xff0c;滞回比较器还可以设计成开漏极输出…

Redis的使用场景——热点数据缓存

热点数据缓存 Redis的使用场景——热点数据的缓存 1.1 什么是缓存 为了把一些经常访问的数据&#xff0c;放入缓存中以减少对数据库的访问效率&#xff0c;从而减少数据库的压力&#xff0c;提高程序的性能。【在内存中存储】 1.2 缓存的原理 查询缓存中是否存在对应的数据如…

[240728] Wikidata 介绍 | 微软与 Lumen 合作提升人工智能算力

目录 Wikidata 介绍微软与 Lumen 合作提升人工智能算力 Wikidata 介绍 中文&#xff1a; 文言: 粤语&#xff1a; 来源&#xff1a; https://www.wikidata.org/wiki/Wikidata:Introduction/zh 微软与 Lumen 合作提升人工智能算力 为了满足人工智能工作负载不断增长的需求&am…

从零开始写 Docker(十九)---增加 cgroup v2 支持

本文为从零开始写 Docker 系列第十九篇&#xff0c;添加对 cgroup v2 的支持。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#xff1a;深入理解 Docker 核心原理&#xff1a…

微软蓝屏”事件暴露了网络安全哪些问题?

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

cadence SPB17.4 - allegro - 设置不同网络之间的距离规则

文章目录 cadence SPB17.4 - allegro - 设置不同网络之间的距离规则概述笔记END cadence SPB17.4 - allegro - 设置不同网络之间的距离规则 概述 插座进来的管脚&#xff0c;可能带来高压&#xff08;有可能用户接错&#xff0c;或者出现浪涌&#xff0c;或者做ESD静电测试&a…

SpringBoot热部署重启关闭(DevTools)

一、DevTools依赖 1、DevTools简介 在Spring Boot项目中&#xff0c;spring-boot-devtools模块提供了多种开发时的便利功能&#xff0c;其中最显著的是restart和livereload特性&#xff0c;它们分别用于应用代码的热重启和前端资源的即时重载。 devtools依赖&#xff1a; &l…

如何在调整节拍时间的过程中保持生产流程的稳定性?

在快节奏的工业生产领域&#xff0c;节拍时间&#xff08;Takt Time&#xff09;——即完成一个完整产品所需的标准时间&#xff0c;是维持生产效率和流程稳定性的关键指标。然而&#xff0c;市场需求的波动、技术升级或是生产线的微调&#xff0c;都可能要求我们对节拍时间进行…

Redis-主从模式

目录 前言 一.主从节点介绍 二.配置redis主从结构 二.主从复制 四.拓扑结构 五.数据同步 全量复制&#xff08;Full Sync Replication&#xff09; 局部复制&#xff08;Partial Replication&#xff09; Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 前言 …

docker安装phpMyAdmin

直接安装phpMyAdmin需要有php环境&#xff0c;比较麻烦&#xff0c;总结了使用docker安装方法&#xff0c;并提供docker镜像。 1.docker镜像 见我上传的docker镜像&#xff1a;https://download.csdn.net/download/taotao_guiwang/89595177 2.安装 1).加载镜像 docker load …

AC/DC和DC/DC开关电源的传导和辐射原理

电磁干扰&#xff08;EMI&#xff09;始终是开关电源&#xff08;AC/DC和DC/DC转换器&#xff09;的潜在问题。如今的电源有很好的电磁发射和抗干扰的能力。但为了满足特定的应用要求&#xff0c;仍要有正确的滤波电路以确保满足标准的要求。 基于AC/DC和DC/DC电源模块的很佳EM…

CentOS7使用yum安装MySQL

废话不多说&#xff0c;直接上干货 1、CentOS7的yum源中默认是没有mysql的&#xff0c;我们先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2、安装mysql-community-release-el7-5.noarch.rpm包 sudo rpm -ivh mysql-community-r…