【C++】类和对象(一):什么是面向对象,访问限定符有哪些,类定义细节,结构体和类的关系。

news2024/10/7 12:23:02

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 一、什么是面向对象?
    • 1.面向过程:
    • 2.面向对象:
  • 二、从struct到class
  • 三、访问限定符
  • 四、class的引入
  • 五、类的定义
    • 1.标准格式
    • 2.类的两种定义方式:
      • (1) 声明和定义全部放在类体中
      • (2) 声明和定义分离
    • 3.注意事项
  • 六、class 和 struct的区别

一、什么是面向对象?

1.面向过程:

我们刚开始接触计算机这门学科时,我们学习的第一个编程语言就是C语言,C语言是面向过程的一门语言。面向过程是一种编程思想,它以实现功能的函数开发为主,需要详细处理每一个细节,通常以函数的形式来一步一步实现整个功能。这种编程方式更侧重于解决问题的整个过程。
例如:洗衣服这一行为:在这里插入图片描述

2.面向对象:

面向对象是一种编程思想,它将现实世界中的事物抽象成一个个对象,通过对象之间的交互来完成程序的设计和实现。
它具有三大特性:封装继承多态等特性,可以更加方便地进行程序设计和维护。

(1) 封装:指将对象的属性和方法封装在一起,对外部隐藏对象的实现细节,只暴露必要的接口。这样可以保证对象的安全性和可靠性,同时也方便了程序的调用和维护。
(2) 继承:指通过继承已有的类来创建新的类,新的类可以继承父类的属性和方法,并且可以在此基础上进行扩展和修改。这样可以减少代码的重复,提高代码的复用性和可维护性。
(3) 多态;指同一个方法可以在不同的对象上产生不同的行为,这样可以提高程序的灵活性和可扩展性。多态可以通过重载和重写来实现。
例如:洗衣服这一行为:
在这里插入图片描述
这里面一共有四个对象,也就是人,洗衣液,脏衣服,洗衣机
具体实现过程是:人把洗衣液脏衣服放入洗衣机
四个对象相互合作,从而实现洗衣服这一过程,然而,人并不知到洗衣机的具体是怎样洗衣服的,这也体现了面向对象的封装性。

二、从struct到class

在C语言中我们学习过结构体,它只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。在C++中,struct依然可以使用,它兼容了C语言中struct的所有用法,并将struct升级成为类。

  • 成为类后,struct中现在不仅可以定义变量,还可以定义函数。它的优势可以体现在如下代码。
    例如:在C语言中实现栈和队列中的函数名相同,但是,C语言中函数是写在全局的,不允许同名函数,必须要在函数名前加上表示。但是,使用C++的struct就可以很好的避免这个问题,

//定义队列
struct Queue
{
//一、定义队列
	//头指针
	QNode* head;
	//尾指针
	QNode* tail;
	//链表长度
	int size;
//二、定义栈的相关方法
    //入队
	void Push(QNode*){ }
    //出队
	DataType Top(){ }
};

struct Stack
{
	//一、定义栈的相关变量
	int* _array;
	size_t _capacity;
	size_t _size;
	//二、定义栈的相关方法
	//压栈
	void Push(int x){ }
	//出栈
	DataType Top(){ }
};
int main()
{
    //栈
	Stack s;
	s.Push(1);
	cout << s.Top() << endl;
	//队列
	Queue q;
	q.Push(6);
    cout << q.Top() << endl;
	return 0;
}

我们可以直接使用栈Stack的各种方法和队列Queue的各种方法,不用考虑同名的问题。

三、访问限定符

在这里插入图片描述

  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  • 如果后面没有访问限定符,作用域就到 } 即类结束

四、class的引入

在上述例子中如果使用类来写这个栈是怎样的呢?如下代码:

class stack2
{
public:
	//压栈
	void Push(int x) { }
	//出栈
	DataType Top() { }
private :
	int* _array;
	int _capacity;
	int _size;
};


int main()
{
	stack2 Ss;
	Ss.Push(9);
	cout << Ss.Top() << endl;
}

五、类的定义

1.标准格式

在C++中类的定标准格式是:

class stack2
{
public:
	//压栈
	void Push(int x) { }
	//出栈
	DataType Top() { }
private :
	int* _array;
	int _capacity;
	int _size;
};
  • 类中由成员函数和成员变量组成
  • 不要忘记最后的分号。

2.类的两种定义方式:

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

如上面栈的代码,栈的声明和定义全部写在类中。
需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理

(2) 声明和定义分离

类声明放在.h文件中,成员函数定义放在.cpp文件中,
注意:成员函数名前需要加类名::

void Stack::Push(int x) 
{
//.......
 }

::表示Push函数是Stack这个域中的。如果Push中有一个变量n,编译器会首先检查是不是当前局部变量中定义的,如果不是,则会去Stack这个域中去找。

3.注意事项

  • class中定义的变量,惯例是private类型的。
  • class中的访问限定符如果不写,默认是private
  • 默认定义在类中的就是内联(inline
  • 函数的声明和定义很好区分。就是是否有具体实现。
  • 变量的声明就是还没有开空间,变量的定义就是已经赋值开辟空间了。
  • 长的函数,声明和定义分离。
  • 短小的函数,可以直接写在类中。
  • 成员变量的命名前加_或者m_,表示这个是内部成员里的
    例如:在写一些初始化函数时,将值赋给类中的变量,这样写容易分不清楚哪个是成员变量
	void Init(int year,int month,int day)
	{
		year = year;
		month = month;
		day = day;
	}

为了便于区分,建议这样写:

	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

六、class 和 struct的区别

  • C++中struct可以当成结构体使用,还可以用来定义类。
  • struct定义的类默认访问权限是public,class定义的类默认访问权限是private

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

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

相关文章

使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

1、打开cmd&#xff0c;执行chcp 65001,修改cmd的编码格式为utf8&#xff0c;避免乱码 2、执行指令ffmpeg -list_devices true -f dshow -i dummy,查看当前window的音频和视频名称 3、打开windows系统的"打开声音设置"–“麦克风隐私设置”–"允许应用访问你…

Vue 将响应式数据转为普通对象

toRaw&#xff1a;将一个 reactive 生成的响应式数据转为普通对象。 toRaw 适用于&#xff1a;获取响应式数据对应的普通对象&#xff0c;对这个普通对象所有的操作&#xff0c;都不会引起页面的更新。 markRaw&#xff1a;标记一个对象&#xff0c;使其永远不会再成为响应式…

C++中将数据添加到文件的末尾

参考:https://blog.csdn.net/qq_23880193/article/details/44279283 C中文件的读取需要包含fstream文件&#xff0c;即&#xff1a;#include 文件的读取和写入是是通过流操作来的&#xff0c;这不像输入、输出流那样&#xff0c;库中已经定义了对象cin和cout 文件的读取需要声…

lv11 嵌入式开发 ARM体系结构理论基础2

目录 1 ARM概述 1.1 处理器分类 1.2 SOC概念 2 ARM指令集概述 2.1 ARM指令集 2.2 编译原理 3 ARM存储模型 3.1 ARM数据类型 3.2 字节序 3.3 ARM指令存储 4 ARM工作模式 4.1 ARM工作模式分类 1 ARM概述 ARM的含义 ARM&#xff08;Advanced RISC Machines&#…

VB自定义版影音播放器

利用VB开放自定义播放器&#xff0c;基于系统Quatrz.dll的接口将媒体显示到指定的控件容器中&#xff0c;比如PictureBox,实现播放的基本功能&#xff0c;播放&#xff0c;暂停&#xff0c;停止&#xff0c;音量&#xff0c;平衡&#xff0c;进度&#xff0c;媒体的总时间和进度…

react组件间通信之context

一般用于【祖组件】与【后代组件】间通信 案例&#xff1a; A,B,C,D四个组件的关系分别为&#xff1a;爷爷&#xff0c;爸爸&#xff0c;儿子&#xff0c;孙子 从A向C传递参数&#xff1a;C组件为类式组件 从A向D传递参数&#xff1a;D组件为函数组件 import React, { Componen…

Rust结构体的定义和实例化

1.结构体特点 Rust的结构体跟元组类型比较类似,它们都包含多个相关的值。和元组一样&#xff0c;结构体的每一部分可以是不同类型。但不同于元组&#xff0c;结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字&#xff0c;结构体比元组更灵活&#xff1a…

第二十九章 目标检测中的测试模型评价指标(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 介绍 自动驾驶的一大前提是保证人的安全…

Linux C语言(8)

1、指针 1.1 概念 指针就是地址指针是一种数据类型&#xff0c;是一种保存地址的数据类型int是一种数据类型&#xff0c;是一种保存整数的数据类型 1 2 3 4float是一种数据类型&#xff0c;是一种保存浮点数的数据类型 3.14 1.2 什么是地址 内存分配的最小单位是字节&#xf…

19、Flink 的Table API 和 SQL 中的自定义函数及示例(3)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

5分钟Python安装实战(MAC版本)

最近在学习Chatgpt接口&#xff0c;官方提供三种方式调用Chatgpt接口&#xff0c;分别是curl、python、node.js&#xff1a;具体介绍我放在下方图片 因为熟悉Python&#xff0c;所以我选择了python这种方式&#xff0c;顺便记录下安装过程&#xff0c;整体并不复杂&#xff0c;…

java正则表达式(Pattern类和Matcher类)

文章目录 前言一、Java中使用正则表达式①捕获组②Pattern类与Matcher类Pattern类&#xff1a;Matcher类&#xff1a;Pattern类&Matcher类方法:Pattern类调用方法&#xff08;静态方法&#xff09;&#xff1a;1、public static Pattern compile(String regex)2、public st…

【Java】在实体类中常用的注解校验

1、常用注解&#xff1a; 注解说明Null只能为nullNotNull(message “id不能为空”)必须不为null&#xff0c;可以为空字符串Min(value)必须为一个不小于指定值的数字Max(value)必须为一个不大于指定值的数字NotBlank(message “姓名不能为空”)验证注解的元素值不为空&#…

2000-2021年全国各省资本存量测算数据(含原始数据+测算过程+计算结果)

2000-2021年全国各省资本存量测算数据&#xff08;含原始数据测算过程计算结果&#xff09; 1、时间&#xff1a;2000-2021年&#xff08;以2000年为基期&#xff09; 2、范围&#xff1a;30个省市&#xff08;不含西藏&#xff09; 3、指标&#xff1a;固定资产形成总额、固…

python poetry的教程

Poetry Python世界中&#xff0c;Poetry是一个近年来备受瞩目的工具&#xff0c;它为开发者提供了一个灵活且强大的依赖管理解决方案。Poetry可以帮助开发者管理项目的依赖关系&#xff0c;同时提供了一系列的工具和功能&#xff0c;使开发者能够更轻松地创建和管理复杂的项目。…

申克SCHENCK动平衡机显示器维修CAB700系统控制面板

适用电枢转子的卧式平衡机&#xff0c;高测量率&#xff0c;自动测量循环&#xff0c;自动定标完整的切槽计数可选项&#xff0c;CAB700动平衡测量系统两种皮带驱动方式(上置式或下置式)适用于站立或坐姿操作的人性化工作台设计。 动平衡机申克控制器面板维修型号&#xff1a;V…

关于VUE启动内存溢出

安装node v10.14.2 后 启动公司的VUE项目 使用命令npm run dev 命令 报错&#xff1a; <--- Last few GCs --->[20940:00000244699848E0] 215872 ms: Scavenge 1690.2 (1836.4) -> 1679.6 (1836.4) MB, 5.4 / 0.7 ms (average mu 0.266, current mu 0.253) a…

【编程语言发展史】SQL的发展历史

目录 目录 SQL概述 SQL发展历史 SQL特点 SQL基本语句 SQL是结构化查询语言(Structure Query Language)的缩写&#xff0c;它是使用关系模型的数据库应用语言&#xff0c;由IBM在70年代开发出来&#xff0c;作为IBM关系数据库原型System R的原型关系语言&#xff0c;实现了…

【广州华锐互动】VR虚拟仿真技术为航测实践教学提供了哪些帮助?

在过去的几十年里&#xff0c;航空测量技术发展迅速&#xff0c;为我们提供了前所未有的地理信息获取手段。然而&#xff0c;这个领域的发展并未停止&#xff0c;最新的技术进步——虚拟现实(VR)——正在为航测实践教学开启新的篇章。 VR虚拟现实技术能够创建和体验三维虚拟环境…

Next.js 项目——从入门到入门(Eslint+Prettier)

Next.js官方文档地址 什么是 Next.js 这是一个用于生产环境的 React 框架。 Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验&#xff1a;包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能&#xff0c;无需任何配置。 功能&#xff…