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

相关文章

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea