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

类和对象(一)

类和对象(一)

C++并不是纯面向对象语言

C++是面向过程和面向对象语言的!

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

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60IFJyhm-1678444628031)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307145914432.png)]在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57EYvJu6-1678444628033)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307150028122.png)]

//C++兼容C兼容C结构体用法
typedef struct list {int data;struct list* next;
}Li;
//C++中会把C中的结构体升级为类
struct listnode {int data;listnode* next;
};//这里不需要重命名变量名称,直接可以使用

C++中(.cpp文件),next可以直接用listnode来命名,而C语言中(.c文件),next不可以直接listnodei*来命名。

类中不止可以放变量名,还可以存放函数。

struct listnode {void Init(int n){data = n;next = NULL;}int data;listnode* next;
};
int main()
{//类和对象listnode* l;l->Init(5);return 0;
}

上面结构体的定义,在C++中更喜欢用class来代替。

类的定义:

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分
号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者
成员函数。

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqGXoQ7n-1678444628034)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307184158337.png)]

访问限定符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FRBL1zTr-1678444628034)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307153023041.png)]

访问限定符分为三种:public、protected、private

【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)
    注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
class stack
{
public:int a;int c;
protected:char b;
private:double f;
};

我们是否可以在类外访问private类型参数?

不可以,因为这里是私有,所以会报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfiTuZkR-1678444628034)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307154945936.png)]

C++中struct和class的区别是什么?

struct定义类默认访问限定符为public

解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序给大
家介绍。

class Date
{
public:void Init(int year, int month, int day){year = year;}
private:int year;int month;int day;
};
int main()
{///编译不会出错,但是并不会赋值Date d1;d1.Init(2023, 3, 7);return 0;
}

当成员变量与类中函数参数名相同时,是否会报错?

这里函数参数和成员变量相同,因为局部变量优先,因此不会初始化。-

因此我们如果遇到相同的变量名,我们会在其中一个变量名前面加一个_

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMGRbypo-1678444628035)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307153836285.png)]

this指针:

当定义了两个对象d1,d2,我们的成员函数Init怎么知道我们定义的是哪个对象呢?

class Date
{
public:void Init(int year, int month, int day){_year = year;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2;d1.Init(2023, 2, 3);d2.Init(2023, 2, 3);return 0;
}

编译器会悄悄地帮你多加一个参数来实现区分

通过this这个关键字来实现,这是编译器默认加,我们并不允许在参数or调用时主动加这个东西

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fjiBkp8z-1678444628035)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307161709745.png)]

this指针存在哪里?

并不是存在对象里面,存在栈上,因为它是隐含的形参

vs下面是通过ecx寄存器

this空指针问题:

下面这两句的运行结果

Date* ptr = nullptr;ptr->func();//正常运行//func和init不在对象里面,而是call到公共区域(代码段)找//会不会报错取决于需不需要去变量里面找,而不是解引用符号ptr->Init(2022, 2, 2);//崩溃

func和init不在对象里面,而是call到公共区域(代码段)找
会不会报错取决于需不需要去变量里面找,而不是解引用符号

(*ptr).func();//正常运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzLrlYRx-1678444628035)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307170633704.png)]

类的内存大小:

类的内存大小如何算呢?

类的内存大小可以参考C语言中结构体的计算方法。

class Date
{
public:void Init(int year, int month, int day){year = year;}
private:int year;int month;int day;
};
int main()
{//类和对象Date d1;Date d2;cout<< sizeof(d1) << endl;//12return 0;}

为什么成员变量在对象中,成员函数不在对象中呢?

每个对象成员变量是不一样的,需要独立存储
每个对象调用成员函数是一样的,放到共享区域(代码段)

int main()
{//类和对象Date d1;Date d2;cout<< sizeof(d1) << endl;//12//为什么成员变量在对象中,成员函数不在对象中呢?//每个对象成员变量是不一样的,需要独立存储//每个对象调用成员函数是一样的,放到共享区域(代码段)d1.Init(2023, 3, 7);d2.Init(2022, 2, 2);return 0;
}

因此我们计算类的大小,就需要计算变量的内存大小,不用考虑成员函数,因此跟结构体的算法一样的

Date d1;
Date d2;
cout<< sizeof(d1) << endl;//12
//为什么成员变量在对象中,成员函数不在对象中呢?
//每个对象成员变量是不一样的,需要独立存储
//每个对象调用成员函数是一样的,放到共享区域(代码段)
d1.Init(2023, 3, 7);
d2.Init(2022, 2, 2);
return 0;

}


因此我们计算类的大小,就需要计算变量的内存大小,不用考虑成员函数,因此跟结构体的算法一样的

相关文章:

类和对象(一)

类和对象&#xff08;一&#xff09; C并不是纯面向对象语言 C是面向过程和面向对象语言的&#xff01; 面向过程和面向对象初步认识&#xff1a; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基…...

Java 不同路径

不同路径中等一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#xff1f…...

【SAP PO】X-DOC:SAP PO 接口配置 REST 服务对接填坑记

X-DOC&#xff1a;SAP PO 接口配置 REST 服务对接填坑记1、背景2、PO SLD配置3、PO https证书导入1、背景 &#xff08;1&#xff09;需求背景&#xff1a; SAP中BOM频繁变更&#xff0c;技术人员在对BOM进行变更后&#xff0c;希望及时通知到相关使用人员 &#xff08;2&…...

最新研究!美国爱荷华州立大学利用量子计算模拟原子核

爱荷华州立大学物理学和天文学教授James Vary&#xff08;图片来源&#xff1a;网络&#xff09;美国爱荷华州立大学物理学和天文学教授James Vary和来自爱荷华州立大学、马萨诸塞州塔夫茨大学&#xff0c;以及美国能源部加利福尼亚州劳伦斯伯克利国家实验室的研究人员&#xf…...

零入门kubernetes网络实战-22->基于tun设备实现在用户空间可以ping通外部节点(golang版本)

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章主要是想做一个测试&#xff1a; 实现的目的是 希望在宿主机-1上&#xff0c;在用户空间里使用ping命令发起ping请求&#xff0c;产生的icmp类型的…...

web安全——Mybatis防止SQL注入 ssrf漏洞利用 DNS污染同源策略

目录 0x01 Mybatis防止SQL注入 0x02 sqlmap中报错注入判断 0x03 ssrf漏洞利用 0x04 SSRF重绑定 0x05 DNS污染...

smp_init过程解析

当你看到这样的log&#xff0c;会不会很慌张&#xff1f;竟然由CPU没有启动成功&#xff0c;除了什么故障&#xff1f;本文将结合我遇到的一个问题&#xff0c;将启动过程中bringup secondary cpu的过程分析一下。smp_init代码如下&#xff1a;602 void __init smp_init(void) …...

判断推理之逻辑判断

考点一翻译推理&#xff08;一&#xff09;题目特征题干或选项中出现多组“逻辑关联词”&#xff0c;如&#xff1a;“如果……那么……”、“只要……就……”、“只有……才……”、“所有”、“有些”、“……且……”、“ ……或……”等典型逻辑关联词。&#xff08;二&am…...

2023金三银四常见Handler面试总结,附带答案

以下的Handler的面试题都是在面试过程中总结出来比较常见的面试题&#xff0c;现在分享给大家&#xff0c;希望可以帮助你们&#xff01;1.Handler的实现原理从四个方面看Handler、Message、MessageQueue 和 Looper Handler:负责消息的发送和处理 Message:消息对象&#xff0c;…...

为什么机器人操作系统ROS1、ROS2这么难学

AI回复&#xff1a;ROS1、ROS2是机器人操作系统&#xff0c;涉及到很多复杂的概念和技术&#xff0c;需要有一定的编程和机器人知识基础才能学习。此外&#xff0c;ROS1和ROS2的架构和设计也有很大的不同&#xff0c;需要花费一定的时间和精力去学习和适应。但是&#xff0c;一…...

day01

授课老师 &#xff1a;陶国荣 联系方式 &#xff1a; taogrtedu.cn 授课阶段 &#xff1a; Web前端基础 授课内容 &#xff1a; HTML CSS JavaScript 文章目录一、讲师和课程介绍二、Web前端介绍1. 什么是网页2. 网页的组成3. 网页的优势4. 开发前的准备三、 HTML语法介绍…...

第四十章 linux-并发解决方法五(顺序锁seqlock)

第四十章 linux-并发解决方法四&#xff08;顺序锁seqlock&#xff09; 文章目录第四十章 linux-并发解决方法四&#xff08;顺序锁seqlock&#xff09;顺序锁的设计思想是&#xff0c;对某一共享数据读取时不加锁&#xff0c;写的时候加锁。为了保证读取的过程中不会因为写入名…...

【SPSS】交叉设计方差分析和协方差分析详细操作教程(附案例实战)

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 方差分析概述 交叉设计方差分析...

playwright--核心概念和Selector定位

文章目录前言一、浏览器二、浏览器上下文三、页面和框架四、Selectors1、data-test-id selector2、CSS and XPath selector3、text 文本selector4、id定位selector5、Selector 组合定位五、内置Selector前言 Playwright提供了一组API可自动化操作Chromium&#xff0c;Firefox和…...

响应式操作实战案例

Project Reactor 框架 在Spring Boot 项目 Maven 中添加依赖管理。 <dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId> </dependency><dependency><groupId>io.projectreactor</g…...

NetApp AFF A900:针对任务关键型应用程序的解决方案

NetApp AFF A900&#xff1a;适用于数据中心的解决方案 AFF A 系列中的 AFF A900 高端 NVMe 闪存存储功能强大、安全可靠、具有故障恢复能力&#xff0c;提供您为任务关键型企业级应用程序提供动力并保持数据始终可用且安全所需的一切。 AFF A900&#xff1a;针对任务关键型应…...

使用Houdini输出四面体网格并输出tetgen格式

我们的目标是从houdini输出生成的四面体&#xff0c;希望是tetgen格式的。 众所周知&#xff0c;houdini是不能直接输出四面体的。 有三方案去解决&#xff1a; 输出点云ply文件&#xff0c;然后利用tetgen生成网格。输出Hounidi内置的.geo格式文件&#xff0c;然后写个脚本…...

组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比

组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比 目录 组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现EMD-KP...

【C语言】操作符详解总结(万字)

操作符详解1. 操作符分类2. 算术操作符3. 移位操作符3.1 整数的二进制是怎么形成的3.2 左移操作符3.3 右移操作符4. 位操作符5. 赋值操作符6. 单目操作符6.1 单目操作符介绍6.2 sizeof 和 数组7. 关系操作符8. 逻辑操作符9. 条件操作符9.1 练习19.2 练习210. 逗号表达式11. 下标…...

mac系统手册(帮助/说明)

文章目录1. mac自带的帮助文档2. Mac使用技巧&#xff08;提示&#xff09;2.1 聚焦搜索2.2 截图&#xff08;录制屏幕&#xff09;2.3 调出右键菜单2.4 快速查看2.5 翻译2.5.1 词典解释2.5.2 翻译&#xff08;字、词和句&#xff09;3. macOS使用手册3.1 在聚焦中进行计算和转…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...