C/C++语言基础--C++面向对象、类、对象概念讲解

news2024/9/20 18:45:41

本专栏目的

  • 更新C/C++的基础语法,包括C++的一些新特性

前言

  • 今天更新的比较晚了,主要一直用是谷歌Colab训练模型,访问国内csdn反而不好使了,请大家见谅;
  • C++是面向对象的语言,本文将介绍什么是面向对象、什么是类、什么是对象、类和对象的关系是什么?
  • 欢迎大家点赞 + 收藏 + 关注;
  • C语言后面也会继续更新知识点,如内联汇编;
  • 本人现在正在写一个C语言的图书管理系统,1000多行代码,包含之前所学的所有知识点,包括链表和顺序表等数据结构,请大家耐心等待!!

类和对象

面向对象

概念

定义:面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

上面是官方的定义,对于初学的你,初次看是否能理解呢?如果能理解,那面向过程和面向对象区别能否举个例子呢?

  • 看不没有关系,面向对象会伴随程序员一生,每个阶段的理解都会不同
  • 对于面向对象和面向过程的区别,我感觉一个经典的案例可以说明这件事情:如何把大象关机冰箱🤠
    • 对于面向过程:面向过程就是把每一步想好,然后一步一步照做,比如说把大象关机冰箱可以分为3步,第一步,打开冰箱门;第二步,把大象关进冰箱;第三步,关闭冰箱门。(当然,也可以分为4步、5步),面向过程就是这样,想好每一步的过程,然后按照步骤分别执行
    • 对于面向对象:在面向对象中有一句话,万物皆对象,对象是现实世界的理解和抽象,如果用面向对象来理解把大象关机冰箱,首先,需要明白这个过程有几个对象,很明显,这里有两个对象,大象与冰箱;其次,需要分别对大象和冰箱做考虑,很明显,对于大象来说,只有一个动作,就是把大象关进冰箱门,对于冰箱来说,有打开和冰箱门两个动作;接下来,每个动作在面向对象有一个专有名词叫做方法;最后,就是按照常见,对方法进行排列组合,:happy:

类和对象

在这里插入图片描述

什么是类?

类,即类别:类是具有相似属性和行为的一组实例集合,比如说:

  • 世界上所有人都有一个相似的东西,那就我们都是人类,简称人,:happy:,所以人也可以抽象成一个类;
  • 对于长方形、圆、正方形……来说,他们都抽象成平面几何,他们都有共同的特性,就是有面积…………

以上两点看起来很**”无语“**,但是这就是面向对象的思想案例,就像是我们说的一切复杂的东西本质都是简单的。

从百度copy了两张图片,如下:

在这里插入图片描述

什么是对象?

一个具体东西,是一个对象的实例,就像人是一个对象,但是我是一个类,你也是一个类,他也是

四大特性

面向对象主要有四大特征:抽象、封装、继承、多态。

1、抽象(abstract)

抽象是将类对象的共同特征总结、提取出来构造类的过程,只关注对象的哪些属性和行为,并不关注这此行为的细节是什么。

属性抽象:表示世界中一类事物的特征,就是对象的属性。比如鸟有翅膀,羽毛等(类的属性)

行为抽象:表示世界中一类事物的行为,就是对象的行为。比如鸟会飞,会叫(类的方法)

2、封装(encapsulation )

通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口,,隐藏了实现细节,比如说封装一个对数组的遍历:

void foreach(int a[], int n) 
{
    for(int i = 0; i < b; i++) {
        std::cout << i << " ";
    }
    std::endl;
}

//举例
int main()
{
    int a[] = {1, 2, 3, 4, 5};
    foreach(a, sizeof(a) / sizeof(a[0]));  // 这个时候会帮你遍历,会输出数组里面的内容
}

/*
*  输出:
* 1 2 3 4 5
*

封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。

3、继承(inheritance)

继承是从已有类得到继承信息创建新类的过程,继承让变化中的软件系统有了一定的延续性,提高了代码的复用率。

4、多态(Polymorhism)

多态是指允许不同类的对象对同一消息做出响应。多态性包括参数化多态性和包含多态性。

动态链接 -->对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将调用子类中的这个方法,这就是动态链接。

总结

在实践中体会,光看概念始终只会停留在表面。

类的创建和对象的实例化

类的创建和C语言中的结构体类似,只不过关键变成了class,当然其实也是可以使用struct的。

类中除了可以定义成员变量(属性)之外,还可以定义成员函数(方法),类还可以设置访问权限,可以控制类中的成员在何处能访问。

三个访问权限限定符:用来设置成员变量和成员函数的访问属性。

  • public:公有成员,它们允许被本类或其它类的成员函数(通过对象)访问或调用,是类的外部接口,成员函数一般定义为public属性;
  • private:私有成员,它们只允许被本类的成员函数访问,数据成员一般定义为private属性;
  • protected:保护成员,它们允许被本类的成员函数和派生类的成员函数访问或调用。

示例

  • private:只能在内部访问,如下面:
class Student
{
public:
	void setMess(std::string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}

	std::string getName()
	{
		return this->m_name;
	}

	int getAge()
	{
		return this->m_age;
	}

private:
	std::string m_name;
	int m_age;
};

这个时候在外部访问,会出现访问不到的现象,如下:

在这里插入图片描述

如果需要访问,则需要在类中定义接口,如:getName,getAge,通过接口返回值访问,如下:

在这里插入图片描述

  • public: 可以在外部访问
class Student
{
public:
	void setMess(std::string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}

private:
	std::string m_name;
	int m_age;
};

可以直接访问:

在这里插入图片描述

成员函数命名规则
  • 在每个成员变量前加 m_
  • 在每个成员变量后加_
class Animal 
{
private:
    int m_age{0};
public:
    //可以通过共有的函数来访问私有成员
    void print()
    {
        cout << "age:" << m_age;
    }
}

class和struct的区别

前面说道class也是可以用struct替代的,那么他们两个之间有什么区别吗?

区别只有一个:struct定义的类属性是默认公有的,而calss定义的类属性是私有的.

在这里插入图片描述

类的定义和成员函数定义分离

一般将类的定义放在头文件(.h) 中,类的实现放在源文件(.cpp) 中,而main主函数可以放在另一个源文件中。

何谓分离?即把函数的定义放在类的外部实现!这种操作提高了代码的耦合性,更好维护。

成员函数的定义方式与其他函数的定义方式基本相同,但必须在成员函数名前面加上类名和作用域限定符(简称域运算符)

在这里插入图片描述

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

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

相关文章

jmeter+ant+git+jenkins

基于工具的接口自动化&#xff08;jmeterantgitjenkins&#xff09; 1.1 简介 Jmeter、Ant、Git和Jenkins是一套结合了测试、代码管理和持续集成/持续部署&#xff08;CI/CD&#xff09;的工具链&#xff0c;可以帮助开发者进行高效的接口开发和测试。这四个工具可以相互配合…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署SQLite数据库浏览器sqlite-web

828华为云征文&#xff5c;华为云Flexus云服务器X实例之openEuler系统下部署SQLite数据库浏览器sqlite-web 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、sqlite-web介绍2.1 sqlite-web简介2.2…

C语言 | Leetcode C语言题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; int cmp(const void* _a, const void* _b) {int *a *(int**)_a, *b *(int**)_b;return a[0] b[0] ? a[1] - b[1] : b[0] - a[0]; }int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** …

TypeScript入门 (二)控制语句

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文主要讲解TypeScript中控制语句的部分&#xff1b;希望通过我的知识点总结&#xff0c;能够帮助你更好地…

OpenCV基础入门30讲(Python)——第一讲 环境配置

学习基础要求&#xff1a; 1、会Python。 版本要求&#xff1a; 1、电脑系统&#xff1a;Windows10&#xff08;理论上Ubuntu或者Windows10和Windows11都可以&#xff09; 2、Python版本&#xff1a;Python 3.8&#xff08;理论上Python 3.6-3.9都可以&#xff09; 3、OpenCV版…

微博计算架构实战

课前回顾-性能估算方法 用户量预估 用户行为建模和性能估算 高性能计算架构设计 发微博 发微博是写操作&#xff0c;可以用与写缓冲(Buffer)么&#xff1f;最好是不要加&#xff0c;写缓冲会使得写入速度变慢&#xff0c;比如发送了微博10分钟后&#xff0c;别人还看不到&…

Ansible——Playbook基本功能

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1&#xff09;“play”2&#xff09;“task”3&#xff09;“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法&#xff1a;1. 基本结构2. 数据类型3. 列表4. 字典&#xff08;映射&#xff09;5. 注释…

CSS概览

概述 是什么 cascading style css 层叠样式表 由W3C制定的网页元素定义规则 为什么 美化 怎么办 设置样式 布局 css 引入 内部样式表 在head标签内部使用style标签 <html><head><style>.id{width: 400px;height: 400px;border: 1px solid black;ma…

2-98 基于matlab的苹果特征检测

基于matlab的苹果特征检测&#xff0c;苹果面积&#xff1a;利用函数bwarea计算白色区域的像素点的个数total。利用total与整幅图片的像素值&#xff08;x*y&#xff09;之比,再与图片的面积相乘,得出苹果面积&#xff1b;缺陷检测&#xff1a;提取出坏损部位的轮廓&#xff0c…

[Golang] Context

[Golang] Context 文章目录 [Golang] Context什么是context创建context创建根context创建context context的作用并发控制context.WithCancelcontext.WithDeadlinecontext.WithTimeoutcontext.WithValue 什么是context Golang在1.7版本中引入了一个标准库的接口context&#xf…

新手学习Python第十一天,准备今天全部学完系列

——早上07&#xff1a;30到达实验室&#xff0c;开始学习&#xff0c;中秋小长假已过&#xff0c;心已收—— 一、__new__与__init__创建对象的过程 class Person(object):def __new__(cls,*args,**kwargs): *表示位置参数&#xff0c;**表示关键字参数print(__new__被调用…

管道缺陷检测系统源码分享

管道缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【鸿蒙 HarmonyOS NEXT】组件嵌套滚动:nestedScroll

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-syst…

Java SE基础知识详解:源于技术书籍的深度解读

写在前面 ⭐️在无数次的复习巩固中&#xff0c;我逐渐意识到一个问题&#xff1a;面对同样的面试题目&#xff0c;不同的资料来源往往给出了五花八门的解释&#xff0c;这不仅增加了学习的难度&#xff0c;还容易导致概念上的混淆。特别是当这些信息来自不同博主的文章或是视…

Day02Day03

1. 为什么拦截器不会去拦截/admin/login上&#xff0c;是因为在SpringMvc中清除了这种可能。 2.使用自己定义注解&#xff0c;实现AOP&#xff08;insert ,update&#xff09; 3.使用update最好使用动态语句&#xff0c;可以使用多次 4.使用阿里云的OSS存储。用common类 5.在写…

Python 课程16-Pygame

前言 Pygame 是一个基于 Python 的游戏开发库&#xff0c;专门用于多媒体应用程序开发&#xff0c;特别是 2D 游戏。它提供了处理图像、声音、键盘、鼠标等交互功能的 API&#xff0c;并且能够与 OpenGL 集成&#xff0c;用于更复杂的图形操作。Pygame 是初学者和业余开发者学…

erlang学习:mnesia数据库与ets表1

Mnesia 和 ETS 都是 Erlang 提供的表管理工具&#xff0c;用于存储和检索数据&#xff0c;但它们之间有一些重要的区别和共同点。 共同点 都是Erlang提供的表存储机制&#xff1a;ETS 和 Mnesia 都允许你在内存中创建表&#xff0c;并且可以用来存储键值对或者更复杂的数据结…

实战16-RVP定义完成适配

新增文件 //设计搞总宽度 const DRAFT_WIDTH 360//将元素的设计搞大小转化为真机中的大小 export default function rvp(val: number) {/*计算元素真正的大小&#xff1b;* 元素在设计稿的大小 / 设计搞总宽度 x / 真机宽度 (保证元素在不同设备占比相同)x 元素在设计稿的大…

论文不会写?分享6款AI论文写作免费一键生成网站!

在当今学术研究和写作领域&#xff0c;AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。本文将分享6款免费一键生成AI论文写作网站&#xff0c;并重点推荐千笔-AIPassPaper。 …

uniapp富文本editor输入二次扩展兼容微信小程序

在uni-app中开发富文本输入功能&#xff0c;并使其兼容微信小程序&#xff0c;需要注意一些特定的限制和解决方案。由于微信小程序本身对HTML的支持有限&#xff0c;直接在小程序中实现像Web那样完整的富文本编辑功能&#xff08;如使用CKEditor、Quill等&#xff09;是不可能的…