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

news2024/12/25 9:23:38

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

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、析构函数也可以默认生成,功能和构造函数类似。
析构函数只有一个,不能被重载

拷贝构造

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

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

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

相关文章

机器学习笔记——支持向量机

支持向量机 参数模型对分布需要假设&#xff08;这也是与非参数模型的区别之一&#xff09;间隔最大化&#xff0c;形式转化为凸二次规划问题 最大化间隔 间隔最大化是意思&#xff1a;对训练集有着充分大的确信度来分类训练数据&#xff0c;最难以分的点也有足够大的信度将…

-31-()

在终端运行时消除输入空格对程序的影响可以使用{在scanf后加“getchar()”或者在scanf&#xff08;“空格%d”,&a&#xff09;} 按位与和移位操作符只能用于整数且都要转位二进制后进行相应操作 不创建临时变量&#xff0c;实现两个数的交换&#xff1a;1——使用加减法&…

插卡式仪器模块:数据记录模块(插卡式)

• 32 位分辨率 • 250 KSPS 采样率 • 可以同时并且连续地记录两个通道的电压输入 • 实时上传原始数据至 PC 端 通道22输入阻抗电压22 kΩ10 MΩ电流0.2 Ω输入范围电压 250 mV 4.5 V电流1.5 A耦合DCDC带宽450 Hz385 HzADC 分辨率32 Bits24 Bits采样率10 kSPS250 kSPS测量…

【最新鸿蒙应用开发】——类Web开发范式1——生命周期

兼容JS的类Web开发范式 类Web命令式开发的生命周期 1. 应用生命周期 1.1. app.js 每个应用可以在app.js自定义应用级生命周期的实现逻辑&#xff0c;包括&#xff1a; onCreate&#xff1a;在应用生成时被调用的生命周期函数。 onDestroy&#xff1a;在应用销毁时被调用的生…

高德地图简单实现点标,和区域绘制

高德地图开发文档:https://lbs.amap.com/api/javascript-api/guide/abc/quickstart 百度搜索高德地图开发平台 注册高德地图开发账号 在应用管理中 我的应用中 添加一个Key 点击提交 进入高德地图开发文档:https://lbs.amap.com/api/javascript-api/guide/abc/quickstart …

详解FedProx:FedAvg的改进版 Federated optimization in heterogeneous networks

FedProx&#xff1a;2020 FedAvg的改进 论文&#xff1a;《Federated Optimization in Heterogeneous Networks》 引用量&#xff1a;4445 源码地址&#xff1a; 官方实现&#xff08;tensorflow&#xff09;https://github.com/litian96/FedProx 几个pytorch实现&#xff1a;…

【激光雷达】

激光雷达 机械式360扫描雷达半固态激光雷达二维扫描一维扫描 固态激光雷达OPA固态激光雷达&#xff08; 光学相控阵技术&#xff09;Flash激光雷达 FMCW 激光雷达 激光雷达技术在近几年可以说是蓬勃发展&#xff0c;新能源汽车的大量使用&#xff0c;给雷达技术的发展提供了肥沃…

C++系统编程篇——linux编译器 gcc/g++(链接动静态库)

linux编译器-gcc/g &#xff08;1&#xff09;g安装&#xff08;gcc一般自带&#xff0c;g需要下载&#xff09; sudo yum install -y gcc-c g --version gcc用于编译C语言代码&#xff0c;g用于编译C代码 &#xff08;2&#xff09;程序翻译过程 选项“-o”是指目标文件…

Python的else子句7个妙用,原来还能这样用,整挺好!

## 1、条件语句else基础 &#x1f504; 1.1 简单else的常规操作 在Python中&#xff0c;else子句通常跟在if或一系列if-elif之后&#xff0c;提供一个“否则”的情况处理路径。如果前面的所有条件都不满足 &#xff0c;程序就会执行这里的代码块。例如 &#xff0c;检查一个数…

目标检测(R-CNN)系列(Pytorch 26)

一 R-CNN 除了之前描述的单发多框检测之外&#xff0c;区域卷积神经网络&#xff08;region‐based CNN或regions with CNN features&#xff0c; R‐CNN&#xff09;(Girshick et al., 2014)也是将深度模型应用于目标检测的开创性工作之一。下面介绍R‐CNN及其一 系列改进方法…

【JavaEE】Spring Boot MyBatis详解(一)

一.MyBatis的基本概念与相关配置. 1.基本概念 MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。MyBatis本是Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c;并且改名为MyBatis. 2013年11月迁移到Github.持久层…

吴恩达2022机器学习专项课程C2W3:2.25 理解方差和偏差(诊断方差偏差正则化偏差方案)

目录 引言名词替代影响模型偏差和方差的因素1.多项式阶数2.正则化参数 判断是否有高偏差或高方差1.方法一&#xff1a;建立性能基准水平2.方法二&#xff1a;建立学习曲线 总结 引言 机器学习系统开发的典型流程是从一个想法开始&#xff0c;然后训练模型。初次训练的结果通常…

SpringSecurity入门(四)

18、权限管理/授权 18.1、针对url配置 配置SecurityConfig package com.wanqi.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.bu…

基于STM32的595级联的Proteus仿真

文章目录 一、595级联1.题目要求2.思路3.仿真图3.1 未仿真时3.2 模式A3.2 模式B3.3 故障模式 二、总结 一、595级联 1.题目要求 STM32单片机&#xff0c;以及三个LED灯对应红黄绿灯&#xff0c;IIC的OLED显示屏&#xff0c;温湿度传感器DHT11&#xff0c;两个独立按键和两个5…

复数乘法IP核的使用

一、IP核解析 在这张图片中&#xff0c;我们看到的是一个“Complex Multiplier (6.0)” IP 核的配置界面。以下是各个配置参数的详细说明&#xff1a; 1.1 Multiplier Construction Use LUTs: 选择这个选项时&#xff0c;乘法器将使用查找表&#xff08;LUTs&#xff09;来实现…

【数据分析系列】交叉列联表与卡方检验:数据解读与Python实践应用

目录 一、交叉列联表和卡方检验的关系 &#xff08;一&#xff09;什么是交叉列联表 &#xff08;二&#xff09;什么是卡方检验 &#xff08;三&#xff09;除了卡方检验&#xff0c;列联表分析还可以结合其他统计方法 二、列联表只能用于两个分类变量吗&#xff1f; 三、…

随机点名软件,教师必备NO.106

事先需要新建一个txt文本文档&#xff0c;里面输入名单&#xff0c;一行一个 点击文件-导入TXT-点击开始抽取 资源来源于网络&#xff0c;免费分享仅供学习和测试使用&#xff0c;请勿用于商业用途&#xff0c;如有侵权请联系删除&#xff01; 下载地址&#xff1a;点击查看…

CISCN2023 初赛部分复现

Misc 1. 被加密的生产流量 涉及到modbus协议 modbus && frame.len 66过滤之后&#xff0c;每条流量最后两个字节是base32的密文 脚本一键提取 #modbus_exp import pysharkflag tmp 0 cap pyshark.FileCapture(input_file"D:/下载/CTF附件/ciscn2023/modbu…

js调试过程中修改变量值

1.在想要变更的地方添加断点 2.添加监视表达式 3.执行网页代码&#xff0c;当执行到断点处则会停止 4.点击执行下一步&#xff0c;则会执行监视表达式

68. UE5 RPG 处理多个角色后续bug

我们现在已经有了四个敌人角色&#xff0c;接下来&#xff0c;处理一下在战斗中遇到的问题。 处理角色死亡后还会攻击的问题 因为我们有角色溶解的效果&#xff0c;角色在死亡以后的5秒钟才会被销毁掉。所以在这五秒钟之内&#xff0c;角色其实还是会攻击。主要时因为AI行为树…