C++进阶之路:深入理解编程范式,从面向过程到面向对象(类与对象_上篇)

本文主要是介绍C++进阶之路:深入理解编程范式,从面向过程到面向对象(类与对象_上篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭
~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:C/C++

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

 目录

​何为面向过程,何为面向对象

面向过程(Object Oriented Programming,OOP)

面向对象(Procedure Oriented Programming,POP)

类的引入

C++中的类与C中的结体的关系

数据封装:

成员函数:

继承和多态:

构造函数和析构函数:

类的定义

类的两种定义方式:

1. 声明和定义全部放在类体中

​2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

3.成员变量命名规则的建议:


何为面向过程,何为面向对象

面向过程(Object Oriented Programming,OOP)

面向过程(Procedure Oriented Programming,POP)是将程序视为一系列的过程或函数的集合。在面向过程的编程中,程序的执行流程主要由函数的调用和控制流语句(如条件语句和循环语句)组成。面向过程编程通常关注解决问题的步骤和操作,以过程或函数为单位进行组织和实现。这种编程范式适用于简单的、直接的问题和算法,它注重顺序性和线性执行,即按照特定的顺序执行一系列的函数。数据和函数之间的联系较弱,函数通常使用全局变量或参数传递数据。面向过程编程适用于程序结构相对简单、不需要过多协作和抽象的情况,它可以提供较好的性能和效率。

面向对象(Procedure Oriented Programming,POP)

面向对象(Object Oriented Programming,OOP)则是一种将事物分解成为一个个对象,然后由对象之间分工与合作的编程范式。在面向对象程序开发思想中,每一个对象都是功能中心,具有明确的分工。面向对象编程关注问题的本质,通过不同对象之间的调用和相互协作来解决问题。这种编程范式提供了高度的灵活性、可维护性和扩展性,适合处理复杂的程序设计和大型项目。

 注意:不只有三个特性

类的引入

C++中的类与C中的结体的关系

  • C++兼容c中struct的用法
  • C++升级struct升级成了类

在C++中,类(Class)是一种用户定义的类型(User-Defined Type, UDT),它通常包含数据成员(通常称为类的属性或字段)和成员函数(通常称为类的方法或操作)。类允许我们创建具有共同属性和行为的对象

C++中的类与C语言中的结构体(Struct)在概念上有一些相似之处,但也存在显著的区别:

数据封装

在C++中,类的数据成员(属性)通常是私有的(尽管默认情况下是公有的,但程序员通常会选择将它们设为私有),这意味着只有类的成员函数(方法)可以直接访问这些数据。这种封装有助于隐藏类的内部状态,只暴露必要的接口给类的使用者。

相比之下,C语言的结构体通常没有封装性,它的成员都是公开的,可以被外部代码直接访问(不安全)

成员函数

C++的类可以包含成员函数,这些函数定义了对象可以执行的操作。

结构体在C语言中也可以包含函数指针,但这与C++的成员函数在概念和使用上有很大的不同。

继承和多态

C++的类支持面向对象编程的三大特性:封装、继承和多态。这意味着一个类可以继承另一个类的属性和方法,并且可以覆盖(或称为“重写”)父类的方法以实现多态。

C语言的结构体不支持这些特性。

构造函数和析构函数

C++的类可以有构造函数和析构函数,这些特殊的成员函数在对象创建和销毁时自动调用。它们用于初始化对象的状态和释放对象的资源。

C语言的结构体没有这样的机制。

总的来说,C++的类在功能上比C语言的结构体更强大和灵活。然而,从语法的角度来看,C++的类与C语言的结构体在定义上非常相似,因为类的成员(包括数据成员和成员函数)都是通过花括号{}和冒号:来定义的。这种相似性使得从C语言过渡到C++变得相对容易。

C++需要兼容C语言,所以C++中struct可以当成结构体使用。
另外C++中struct还可以用来定义类。
和class定义类是一样的,区别是
struct定义的类默认访问权限是public,
class定义的类默认访问权限是private。
注意:在继承和模板参数列表位置,struct和class也有区别

类的定义

class className
{// 类体:由成员函数和成员变量组成
};     // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面

号不能省略

类体中内容称为类的成员:类中的变量称为类的属性成员变量; 类中的函数称为类的方法或者

成员函数

类的两种定义方式:

1. 声明和定义全部放在类体中

需注意:成员函数如果在类中定义,编译器可能会将其当成 联函数处理。

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

注意:成员函数名前需要加类名::

一般情况下,更建议采用第二种方式!

为什么?

当代码被分割到多个文件中书写时,这加强了代码的多个重要特性,这些特性通常被称为“软件设计的原则”或“代码的可维护性”。以下是一些主要的好处:

  1. 模块化和可重用性通过将代码划分为不同的模块或组件,每个模块负责特定的功能,这增强了代码的可重用性。这些模块可以被不同的项目或同一项目的不同部分重复使用。

  2. 可维护性:将代码分割到多个文件中可以使代码更容易被理解和维护。每个文件通常包含一个或一组紧密相关的功能,这有助于减少代码的复杂性并使得开发者能够更快速地找到并修改代码中的特定部分。

  3. 可读性:当代码被组织成多个文件时,每个文件通常都有明确的命名约定和用途描述,这使得其他开发者更容易理解代码的结构和目的

  4. 编译和链接效率:在大型项目中,将代码分割到多个文件中可以加快编译速度,因为编译器只需要重新编译那些已经修改过的文件,而不是整个项目。此外,链接器可以将这些单独编译的文件链接成一个可执行文件。

  5. 团队协作:当多个开发者在同一个项目上工作时,将代码分割到多个文件中可以更容易地进行版本控制和协作。每个开发者可以专注于自己的模块,而不需要担心其他人的代码。

  6. 可扩展性:通过将功能分散到多个模块中,可以更容易地添加新功能或修改现有功能,而不需要对整个项目进行大规模的修改。

  7. 安全性:在某些情况下,将敏感或重要的代码分割到单独的文件中可以提高代码的安全性。例如,可以将包含敏感数据的数据库连接代码放在一个单独的文件中,并限制对该文件的访问权限。

  8. 可测试性:将代码分割到模块中使得单元测试更加容易。开发者可以单独测试每个模块的功能,而不需要运行整个应用程序。

为了充分利用这些好处,开发者通常会遵循一些最佳实践,如使用头文件(.h.hpp)来声明类和函数的接口,并使用源文件(.cpp.cc)来实现这些接口。此外,开发者还会使用命名空间和类来进一步组织代码,并遵循一致的命名和编码规范。

3.成员变量命名规则的建议:

// 我们看看这个函数,是不是很僵硬?
class Date
{
public:void Init(int year){// 这里的year到底是成员变量,还是函数形参?year = year;}
private:int year;
};
所以我们一般都建议这样书写,不容易混淆
{
public:void Init(int year){_year = year;}
private:int _year;
};

或者这样

class Date
{
public:void Init(int year){mYear = year;}
private:int mYear;
};
其他方式也可以的,主要看公司项目的要求。一般都是加个前缀或者后缀标识区分就行~

​​

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

这篇关于C++进阶之路:深入理解编程范式,从面向过程到面向对象(类与对象_上篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971796

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、