当前位置: 首页 > article >正文

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

本专栏目的

  • 更新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.kler.cn/a/324476.html

相关文章:

  • 单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)
  • hive alter table add columns 是否使用 cascade 的方案
  • (一)Ubuntu20.04服务器端部署Stable-Diffusion-webui AI绘画环境
  • 支持向量机SVM——基于分类问题的监督学习算法
  • C++ | Leetcode C++题解之第560题和为K的子数组
  • 第1章: 初识Pillow(PIL)
  • Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite
  • Visual Studio 2022
  • 大功率蓝外光激光模组能使用多长时间?
  • STM32+PWM+DMA驱动WS2812 —— 2024年9月24日
  • 信息安全工程师(23)网络安全体系相关模型
  • H.264编解码介绍
  • 什么是托管安全信息和事件管理 SIEM?
  • STM32嵌入式编程学习到提高:【4】UART串口打印
  • 基于baidu的云函数实现隐藏c2真实地址
  • 企业如何做可视化数据看板
  • 物联网系统中LCD屏主流驱动方案详解
  • 华为vxlan
  • 基于VUE的在线茶叶购物网站的设计与实现后端SpringBoot数据库MySQL
  • 算法竞赛当中离散化算法的初步介绍和简单应用
  • 10_React router6
  • React Native 在 build iOS 的时候如果出现关于 `metro` 的错误
  • My_string 运算符重载,My_stack
  • JavaScript 中的闭包的形成及使用场景
  • 代码随想录_刷题笔记_第三次
  • MySQL 高级 - 第十五章 | MySQL 事务日志