类和对象的学习总结(一)

面向对象和面向过程编程初步认识

C语言是面向过程的,关注过程(分析求解问题的步骤)
例如:外卖,关注点菜,接单,送单等
C++是面向对象的,关注对象,把一件事拆分成不同的对象,对每个对象进行分别管理,依靠对象之间的交互完成。例如:外卖,关注用户,骑手,商家三个核心对象,三者交互完成这件事

文章目录

  • 类的引入
  • 访问限定符
  • 类域
  • 类的大小(sizeof)
  • this指针
  • 构造函数
  • 析构函数
  • 拷贝构造

类的引入

在C语言中有结构体(struct)的概念,C++是兼容了struct在C语言中的用法,同时增加了结构体中实现函数功能,为了区别结构体C++引入了新的关键字class——类,
类中的内容是类的成员,变量叫做成员变量或类的属性,函数叫做成员函数或类的方法
C++中类和结构体基本上的用法是相同的
注意:
变量的定义是指开空间,类中的成员变量都是声明,对象实例化时,才是定义

class Date {
	int _year;
	int _month;
	int _day;
};

这是一个简单的日期类
也可以写作

struct Date2 {
	int _year;
	int _month;
	int _day;
};

在这里插入图片描述
上述代码访问d1._year 报错了,d2._year却没有
这就要说到访问限定符了

访问限定符

C++有三种访问限定符,public,private,protected
就是限制对类中的成员进行访问,
public(公有)类里面和外面都可以使用
private(私有)只有类里面可以使用,

protected 先不考虑
class 和 struct 的主要的区别就在这里:
class 不加访问限定符就默认表示私有
struct 默认表示公有

这就是为什么上述代码报错,加上public限定符修饰就可以在外面访问成员变量了
在这里插入图片描述
加上这样的修饰就可以访问了,

public:这样就是修饰为公有,范围到下一个访问限定符或者结尾。
一般情况下成员变量都是私有的,不希望直接访问或修改成员变量,而是通过函数调用来修改

类域

我们想要对类中的函数进行声明定义分离,该如何操作呢
看下面代码

class Date {

public:
	void print();

	int _year;
	int _month;
	int _day;
};

void print()
{
	_year = 1, _month = 1, _day = 1;
	cout << _year << '-' << _month << '-' << _day << endl;
}


int main()
{
	Date d1;
	d1.print();

	return 0;
}

上述打印功能函数会直接报错,这里就要了解类域

类定义了一个新的作用域,类的所有成员都在类的作用域中,类外定义成员时需要使用 :: 操作
正确代码应该是


void Date::print()
{
	_year = 1, _month = 1, _day = 1;
	cout << _year << '-' << _month << '-' << _day << endl;
}

这样就可以了

类的大小(sizeof)

类中成员函数的功能都是一样的,所以类里面只存成员变量,成员函数存在一个公共的区域(代码段),每个对象里面都放成员函数太冗余了(每创建一个类,都为函数开辟空间太浪费)
没有成员变量的类大小为 1byte,为了表示这个对象存在过。

遵循结构体内存对齐规则(空间换时间,提高效率)

this指针

上述打印日期时,我们没有传入参数,但是能打印出结果,

class Date {

public:
	//构造函数初始化,先不用管
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << this->_year << '-' << _month << '-' << _day << endl;
	}

	int _year;
	int _month;
	int _day;
};


int main()
{
	Date d1(2005, 8, 27);
	Date d2(2004, 8, 27);
	d1.print();
	d2.print();
	return 0;
}

运行结果如下
在这里插入图片描述
可以通过this指针来找到d1中的成员变量,this指针编译时编译器会自动不上,不写也可以,但注意的时,this在函数中可以使用,不能传参。this指针相当于 &d1,this指针是形参,对&d1的拷贝,存在于栈区

面向对象的三大特性:封装,继承,多态
封装的本质是一种管控,把数据和方法都放在类里面,通过访问限定符对成员变量进行限制,也更便于维护

先来看封装

构造函数

	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

上述代码中,这个函数可以对日期类成员变量进行初始化。
这就是一个构造函数,主要任务是初始化对象。
构造函数有以下几个特性
1、函数名与类名相同
2、无返回值
3、对象实例化时自动调用,不需要自己操作
'4、构造函数可以重载
5、如果没有写构造函数,构造函数可以自动生成一个构造函数,但是它不做任何事情
6、编译器自动生成的构造函数(内置类型不做任何处理,自定义类型去调用它的构造函数)

无参数,全缺省,自动生成的都是默认构造函数,一般建议提供全缺省构造函数
绝大多数情况下,要自己写构造函数,只要写了一个,编译器就不会默认生成了(一般构造函数写成全缺省的最方便

析构函数

析构函数:清理资源
~类名()
1、没有返回值,没有参数
2、函数结束自动执行析构函数,清理资源
3、析构函数也可以默认生成,功能和构造函数类似。
析构函数只有一个,不能被重载

拷贝构造

拷贝构造函数:
传参要传引用,否则会无穷递归(传参本身就会产生形参,形参又要调用拷贝构造函数,从而形成无限递归)
拷贝构造是默认成员函数,如果没有显示定义,会默认生成拷贝构造函数
内值类型:浅拷贝(值拷贝)
自定义类型:调用拷贝构造函数
成员变量中有数组指针,就需要进行深拷贝
默认生成的拷贝构造不能实现深拷贝

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十大排序

本文将以「 通俗易懂」的方式来描述排序的基本实现。 &#x1f9d1;‍&#x1f4bb;阅读本文前&#xff0c;需要一点点编程基础和一点点数据结构知识 本文的所有代码以cpp实现 文章目录 排序的定义 插入排序 ⭐ &#x1f9d0;算法描述 &#x1f496;具体实现 &#x1f…

记一次Linux下Docker镜像服务器磁盘空间清理

我们开发环境Jenkins构建项目时报服务器磁盘空间不足&#xff0c;导致项目自动化构建部署失败&#xff0c; Docker镜像服务器磁盘空间清理我们做了多次了&#xff0c;之前在清理Docker镜像服务器时走了不少弯路&#xff0c;查了不少Docker镜像服务器空间清理&#xff0c;都大同…

架构设计-全局异常处理器404、405的问题

java web 项目中经常会遇到异常处理的问题&#xff0c;普遍的做法是使用全局异常处理&#xff0c;这样做有以下几种原因&#xff1a; 集中化处理&#xff1a;全局异常处理允许你在一个集中的地方处理整个应用程序中的异常。这有助于减少代码重复&#xff0c;因为你不必在每个可…

C++的string类

目录 一、导入 二、接口学习 1.默认成员函数 2.迭代器相关的函数iterator 3.与容量相关的函数Capacity系列 4.与成员权限相关的函数Element access: 5.修改器相关的函数Modifiers&#xff1a; 6.字符串操作接口函数String operations:​编辑 三、扩展 一、导入 学习过…

修复损坏的Excel文件比你想象的要简单,这里提供几种常见的修复方法

打开重要的Excel文件时遇到问题吗?Microsoft Excel是否要求你验证文件是否已损坏?Excel文件可能由于各种原因而损坏,从而无法打开。但不要失去希望;你可以轻松修复损坏的Excel文件。 更改Excel信任中心设置 Microsoft Excel有一个内置的安全功能,可以在受限模式下打开有…

阿里通义千问 Qwen2 大模型开源发布

阿里通义千问 Qwen2 大模型开源发布 Qwen2 系列模型是 Qwen1.5 系列模型的重大升级。该系列包括了五个不同尺寸的预训练和指令微调模型&#xff1a;Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B 以及 Qwen2-72B。 在中文和英文的基础上&#xff0c;Qwen2 系列的训练数…

前端开发部署:Visual Studio Code + vue

〇 说明 本教程全部采用默认安装路径&#xff0c;因为在进行自定义路径安装的时候&#xff0c;需要配置各种环境变量&#xff0c;在这个配置过程中&#xff0c;可能出现各种很混乱的问题。 一 安装Node.js 1 下载https://nodejs.org/en 2 按照默认NEXT执行 C:\Program Files…

C++ BFS相关题目

目录 图像渲染 岛屿数量 图像渲染 733. 图像渲染 vis就是标记1有没有被用过 符合条件的都放到队列里&#xff0c;每次出队列一个&#xff0c;判四个&#xff0c; 如果要改的值与当前的值相同直接返回 注意&#xff1a;image[x][y] prev要放在坐标判断的后面&#xff…

深度解析地铁票务系统的技术架构与创新应用

在城市交通体系中&#xff0c;地铁作为一种快速、便捷的公共交通方式&#xff0c;已经成为现代都市生活的重要组成部分。而地铁票务系统的技术架构&#xff0c;则是支撑地铁运营的核心之一。本文将深度解析地铁票务系统的技术架构与创新应用&#xff0c;从系统设计、数据管理、…

PE文件(七)扩大节合并节数据目录

添加shellcode有以下几种的方式&#xff1a; 1.直接在任意节的空白区添加代码 2.新增节添加代码 3.扩大最后一个节添加代码 4.合并节并添加代码 今天我们学习如何扩大节&#xff0c;合并节 扩大节 在上一节的学习中&#xff0c;我们可以通过上移NT头和节表覆盖DOS Stub以…

前端技术回顾系列 08|TS 泛型基础

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对你有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供一些动力。 上篇内容回顾:枚举(Enums) 在上篇文章中,我们详细回顾了 TypeScript 中的 枚举(Enums)。 枚举 是一…

spark第三篇sql

spark第三篇sql sparksql概述sparksql四大特性dataframe概述通过读取数据源创建dataFrameDataFrame常用操作DataSet将RDD转换为DataFrame代码开发sparksql 操作hivesqlsparksql读取mysql表中的数据sparksql将结果数据写入到mysql中 sparksql概述 1、sparksql发展史 shark为spa…

HTML静态网页成品作业(HTML+CSS)—— 环保主题介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

MQ解决的问题

系统中MQ能解决哪些问题&#xff1f; 1.不同语言的程序使用MQ通信 2.分布式&#xff0c;微服务&#xff0c;之间的通信&#xff0c;实现服务质检解耦 3.高并发实现销峰作用 4.实现异步&#xff0c;提高用户体验。

“程序员职业素养全解析:技能、态度与价值观的融合“

文章目录 每日一句正能量前言专业精神专业精神的重要性技术执着追求的故事结论 沟通能力沟通能力的重要性团队合作意识实际工作中的沟通案例结论 持续学习持续学习的重要性学习方法进步经验结论 后记 每日一句正能量 梦不是为想象&#xff0c;而是让我们继续前往。 前言 在数字…

Python数据分析与机器学习在电子商务推荐系统中的应用

文章目录 &#x1f4d1;引言一、推荐系统的类型二、数据收集与预处理2.1 数据收集2.2 数据预处理 三、基于内容的推荐3.1 特征提取3.2 计算相似度3.3 推荐物品 四、协同过滤推荐4.1 基于用户的协同过滤4.2 基于物品的协同过滤 五、混合推荐与评估推荐系统5.1 结合推荐结果5.2 评…

docker 下载镜像发现超时,加速加速方法

报错原因有可能旧的不能用了&#xff01;&#xff01;&#xff01;换下面的&#xff01;&#xff01;&#xff01; cat /etc/docker/daemon.json "registry-mirrors": ["https://bhu1x6ya.mirror.aliyuncs.com"] 编辑完成后执行以下命令重启docker即可&a…

企业官网:过时了,但又没完全过时

作为一名互联网冲浪级选手&#xff0c;我经常会看到一些有趣的产品。 这两年比较让我感兴趣的产品有「飞聊」、「即刻」及其旗下的「橙 App」等等&#xff0c;然后我就想上它们的官网看看。 虽然现在 app 是主流&#xff0c;但我非常不喜欢下载 app&#xff0c;一是麻烦&…

基于STM32开发的智能空气质量监控系统

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取&#xff0c;感谢支持&#xff01;⬇ 点击领取更多嵌入式详细资料 问题讨论&#xff0c;stm32的资料领取可以私信&#xff01; 目录 引言环境准备智能空气质量监控系统基础代码实现&…

【吊打面试官系列-Mysql面试题】MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 ?

大家好&#xff0c;我是锋哥。今天分享关于 【MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 &#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 &#xff1f; 以下是 MySQL_fetch_array 和 MySQL…