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.niftyadmin.cn/n/5664749.html

相关文章

容器镜像同步工具image-migrator

1 概述 image-migrator是一个用于容器镜像同步的可执行二进制命令行工具&#xff08;不依赖于docker命令&#xff09;&#xff0c;能够自动将基于Docker Registry v2镜像仓库&#xff08;registry、云厂商容器镜像服务、docker hub、Quay、Harbor &#xff09;中的镜像迁移到基…

ShouldSniffAttr在自动化测试中具体是如何应用?

在自动化测试中&#xff0c;ShouldSniffAttr 这样的函数名通常暗示它是一个用于断言&#xff08;assertions&#xff09;的工具&#xff0c;用于检查某个元素或属性是否符合预期的条件。 虽然这不是一个标准的函数名&#xff0c;但我们可以根据命名推测其用途。 例如&#xf…

一种全新的webapi框架C#webmvc初步介绍

这个框架分三部分&#xff0c;第一部分数据结构层&#xff0c;第二部分http和业务管理以及sql层&#xff0c;第三部分加密层和工具类。 数据结构层分key和数据长度定义 public class Auth { [Key] public string Id { get; set; } [MaxLength(50)…

Ai+若依(智能售货机运营管理系统---帝可得)--货道关联商品【08篇---0004:关联商品】

货道关联商品 需求 对智能售货机内部的货道进行商品摆放的管理 此功能涉及四个后端接口 查询设备类型&#xff08;已完成&#xff09; 查询货道列表&#xff08;待完成&#xff09; 查询商品列表&#xff08;已完成&#xff09; 货道关联商品&#xff08;待完成&#xff0…

迈入IT世界:技术趋势、职业选择与未来展望

迈入IT世界&#xff1a;技术趋势、职业选择与未来展望 1. 引言 随着科技的飞速发展&#xff0c;信息技术&#xff08;IT&#xff09;已经成为当今社会的中坚力量。无论是智能设备、互联网服务&#xff0c;还是数据分析与人工智能&#xff0c;IT技术驱动着各行各业的创新与进步…

基于node.js koa2模拟快递柜存储取出快递微信小程序

本文介绍了一个基于Node.js Koa2框架的快递柜存储和取出快递的微信小程序。首先&#xff0c;我们使用Koa2框架搭建了一个简单的后端服务器&#xff0c;用于处理微信小程序发送的请求。然后&#xff0c;我们实现了快递柜的存储和取出功能&#xff0c;用户可以通过微信小程序扫描…

AttributeError: ‘ComfyUIManagerLogger‘ object has no attribute ‘isatty‘

使用comfyui时可能会出现错误&#xff1a; /pretty_errors/init.py", line 4, in terminal_is_interactive sys.stderr.isatty() AttributeError: ComfyUIManagerLogger object has no attribute isatty 可能跟管理器的更新有关 解决方法&#xff1a; 改一下site-pac…

LCR 023

题目&#xff1a;LCR 023 解法一&#xff1a;哈希表 将链表A所有元素放入Set中&#xff0c;遍历链表B元素&#xff0c;若某一元素在Set中存在&#xff0c;则该元素便是重复元素 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<Object> set …