类与对象(上)

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

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

类的引入 

C 语言结构体中只能定义变量,在 C++ 中,结构体内不仅可以定义变量,也可以定义函数。 比如:之前在数据结构初阶中,用C 语言方式实现的栈,结构体中只能定义变量 ;现在以 C++ 方式实现, 会发现 struct 中也可以定义函数
struct Stack
{int* a;int top;int capacity;void Init(){a = 0;top = 0;capacity = 0;}void Push(int x){//...}
};int main()
{Stack s1;s1.Init();s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);//c++写法/*struct Stack s1;StackInit(&s1);StackPush(&s1, 1);StackPush(&s1, 2);StackPush(&s1, 3);*//c语言写法return 0;
}

我们看一下c++和c语言类有什么区别,发现c++规则变多了但是写起来更简洁了(平常我们用栈还得传参数,现在少传很多),c++直接在类里定义函数,短的函数默认是内联,长的函数建议声明和定义分离(在定义的地方要指明类域)

C++兼容c语言struct的所有用法    struct同时升级成了类
1、类名就是类型,Stack就是类型,不需要加struct
2、类里面定义函数

类的定义

class className
{
// 类体:由成员函数和成员变量组成
};   // 一定要注意后面的分号
class 定义类的 关键字, ClassName 为类的名字, {} 中为类的主体,注意 类定义结束时后面 号不能省略
类体中内容称为类的成员: 类中的 变量 称为 类的属性 成员变量; 类中的 函数 称为 类的方法 或者 成员函数
类的两种定义方式:
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
一般情况下,更期望采用第二种方式。 注意:我们为了方便演示一定义类,大家后序工 作中尽量使用第二种。
成员变量命名规则的建议:
class Date 
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}private:/*int year_;int m_year;int mYear;*/int _year;int _month;int _day;
};

尽量将成员变量写成_的形式

类的访问限定符及封装

我们根据下边代码理解,public意思是公有,类外可以访问,可以看到成员函数放在公有,可以访问,private是私有,类外访问会报错,除非把私有访问限定符去掉,但我们一般不这么做( 默认成员函数放公有,成员变量私有
struct和class区别:
在c++中,二者没有显著区别,最大的区别是struct类不加访问限定符默认是公有,class类默认是私有
【面试题】
问题: C++ struct class 的区别是什么?
解答: 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;_month = month;_day = day;}private:// 声明int _year;int _month;int _day;
};int main()
{//Date::_year = 1;声明没有开空间,不能赋值Date d1;Date d2;d1.Init(2025, 10, 7);d2.Init(2026, 10, 7);//d1._year++;//d2._year++;只有设置为public公有,才能在类外访问return 0;
}

注意:我们一般都会将成员变量设置为私有,成员函数设置公有,因为规定默认不可以在类外访问成员变量(可能会有风险),成员函数在类内外都能访问,成员变量可以在类内访问,在类外可以调用成员函数去访问

类对象模型

如何计算类对象的大小,通过下边的代码

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}//private:// 声明int _year;int _month;int _day;
};class A
{
private:char _ch;int _a;
};class B
{};class C
{
public:void f(){};
};int main()
{Date d1;cout << sizeof(d1) << endl;cout << sizeof(A) << endl;B b1;B b2;cout << sizeof(B) << endl;cout << sizeof(C) << endl;// 无成员变量的类,对象大小开一个字节,这个字节不存储有效数据// 标识定义的对象存在过cout << &b1 << endl;cout << &b2 << endl;return 0;
}

我们可以看到Date类大小是12,A类大小是8,我们猜测只计算成员变量的大小,并且是依照结构体内存对齐(我之前讲过内存对齐,特别详细,有兴趣可以看看),结构体的大小计算的是对象的大小

自定义类型:结构体,枚举,联合-CSDN博客https://blog.csdn.net/eixjdj/article/details/145168323https://blog.csdn.net/eixjdj/article/details/145168323我们也能看到空类和只有成员函数的类都是1字节,无成员变量的类,对象大小开一个字节,这个字节不存储有效数据 标识定义的对象存在过

这些我们都能理解,为什么成员函数不计算大小呢

因为类的大小计算的是对象的大小,对象里边只有成员变量,成员函数存在了共享区(代码段),所以我们计算大小的时候忽略了成员函数的

为什么放在共享区(因为每个对象存的成员变量的值可能是不一样的,要分开放;而成员函数每个对象都可以访问,所以把成员函数放在公共区域(代码段里))

this指针

最后我讲一个极其重要的东西-》this指针

代码示例

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}// 不能显示的写实参和形参// void Print(Date* const this)void Print(){//this = nullptr;err  因为是const//cout << this << endl;// 但是可以在类里面显示的使用//	cout << this->_year << "-" << this->_month << "-" << this->_day << endl;cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;     // 年int _month;    // 月int _day;      // 日
};int main()
{Date d1;d1.Init(2025, 10, 7);Date d2;d2.Init(2026, 10, 7);d1.Print(); // d1.Print(&d1);d2.Print();return 0;
}

为什么我们打印并没有传参数,就能打印不一样的呢

因为是编译器帮我们干了这件事情,当对象调用成员函数时,会将对象的地址传给成员函数的形参,这个形参就是this指针,只不过我们正常看到的是没有参数的版本,所以就能做到不同的对象地址不同,传递不同的参数给this,就会调用专属的实例化出来的对象(不能显示的写实参和形参

this指针的特性(了解)

【面试题】
1. this 指针存在哪里?
存在栈帧上,vs默认是存在ecx寄存器中(this指针是在运行时由编译器自动传给非静态成员函数)this指针会频繁用所以存放在寄存器里
2. this 指针可以为空吗?
可以为空,下边通过题来证明这个
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:void Print(){//cout << _a << endl;cout << "Print()" << endl;}
private:int _a;
};int main()
{A* p = nullptr;// 成员函数的地址不在对象中// 成员变量是存在对象中p->Print();//p->_a = 1;return 0;
}

可以看到这次正常打印,因为p指针是空,并不会解引用Print函数,Print函数是在编译链接时候确定地址,在运行时call调用,和p的空指针没关系,空指针并没有做事情,这里p指针的主要作用是知道Print函数是这个类的,并且把nullptr传递给this指针(成员函数存在对象外边)
而下边这个空指针会报错,会空指针解引用访问_a,那就直接nullptr解引用了(成员变量存在对象中)
感谢支持!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三元组抽取在实际应用中如何处理语义模糊性?

在实际应用中&#xff0c;三元组抽取面临语义模糊性的问题&#xff0c;这主要体现在输入文本的非规范描述、复杂句式以及多义性等方面。为了有效处理这种模糊性&#xff0c;研究者们提出了多种方法和技术&#xff0c;以下是一些关键策略&#xff1a; 基于深度学习的方法 深度学…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组&#xff0c; 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn&#xff0c; 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

智慧脚下生根,智能井盖监测终端引领城市安全新革命

在繁忙的都市生活中&#xff0c;我们往往只关注地面的繁华与喧嚣&#xff0c;却忽略了隐藏在地面之下的基础设施——井盖。这些看似不起眼的井盖&#xff0c;实则承担着排水、通讯、电力等重要功能&#xff0c;是城市安全运转的重要一环。然而&#xff0c;传统的井盖管理面临着…

如何快速开发LabVIEW项目,成为LabVIEW开发的高手

发现了一篇多年前写的文章&#xff0c;转发到这里 如何快速开发LabVIEW项目&#xff0c;成为LabVIEW开发的高手。 如果您手里有LabVIEW项目&#xff0c;领导催的又很紧&#xff0c;该怎么办&#xff1f; 如果您公司规模小&#xff0c;就想把LabVIEW项目快速搞定&#xff0c;有什…

Zemax 非序列模式下的颜色检测器和颜色混合

在 Zemax 的非序列模式中&#xff0c;探测器用于捕获系统中射线的信息。可以使用各种类型的探测器来捕获光学系统性能的不同方面&#xff0c;例如矩形探测器&#xff0c;它存储撞击它的 NSC 源射线的能量数据。 另一种经常使用的探测器类型是 Detector Color&#xff0c;它是一…

Redis(5,jedis和spring)

在前面的学习中&#xff0c;只是学习了各种redis的操作&#xff0c;都是在redis命令行客户端操作的&#xff0c;手动执行的&#xff0c;更多的时候就是使用redis的api&#xff08;&#xff09;&#xff0c;进一步操作redis程序。 在java中实现的redis客户端有很多&#xff0c;…

AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs

论文标题 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning 跨同构异构图的小样本提示学习 论文链接 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning论文下载 论文作者 Xingtong Yu, Yuan…

闲鱼自动抓取/筛选/发送系统

可监控闲鱼最新发布商品&#xff0c;发送钉钉 1&#xff0c;精准关键词匹配&#xff1a;输入核心关键词&#xff0c;精准定位与之高度契合的信息&#xff0c;确保搜索结果直击要点&#xff0c;满足您对特定内容的急切需求。 2&#xff0c;标题关键词智能筛选&#xff1a;不仅着…

AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码

AI编程工具使用技巧&#xff1a;在Visual Studio Code中高效利用阿里云通义灵码 前言一、通义灵码介绍1.1 通义灵码简介1.2 主要功能1.3 版本选择1.4 支持环境 二、Visual Studio Code介绍1.1 VS Code简介1.2 主要特点 三、安装VsCode3.1下载VsCode3.2.安装VsCode3.3 打开VsCod…

【Unity3D】Unity混淆工具Obfuscator使用

目录 一、导入工具 二、各种混淆形式介绍 2.1 程序集混淆 2.2 命名空间混淆 2.3 类混淆 2.4 函数混淆 2.5 参数混淆 2.6 字段混淆 2.7 属性混淆 2.8 事件混淆 三、安全混淆 四、兼容性处理 4.1 动画方法兼容 4.2 GUI方法兼容 4.3 协程方法兼容 五、选项 5.1 调…

2024年终总结:技术成长与突破之路

文章目录 前言一、技术成长&#xff1a;菜鸟成长之路1. 学习与实践的结合2. 技术分享与社区交流 二、生活与事业的平衡&#xff1a;技术之外的思考1. 时间管理与效率提升2. 技术对生活的积极影响 三、突破与展望&#xff1a;未来之路1. 技术领域的突破2. 未来规划与目标 四、结…

计算机网络-运输层

重点内容&#xff1a; 运输层 是整个网络体系结构中的关键层次之一。一定要弄清以下一些重要概念&#xff1a; (1) 运输层为相互通信的应用进程提供逻辑通信。 (2) 端口和套接字的意义。 (3) 无连接的 UDP 的特点。 (4) 面向连接的 TCP 的特点。 (5) 在不可靠的网…

【Elasticsearch】inference ingest pipeline

Elasticsearch 的 Ingest Pipeline 功能允许你在数据索引之前对其进行预处理。通过使用 Ingest Pipeline&#xff0c;你可以执行各种数据转换和富化操作&#xff0c;包括使用机器学习模型进行推理&#xff08;inference&#xff09;。这在处理词嵌入、情感分析、图像识别等场景…

使用 .NET Core 6.0 Web API 上传单个和多个文件

示例代码&#xff1a; https://download.csdn.net/download/hefeng_aspnet/90138968 介绍 我们将在 IFormFile 接口和 .NET 提供的其他接口的帮助下&#xff0c;逐步讨论单个和多个文件上传。 .NET 提供了一个 IFormFile 接口&#xff0c;代表 HTTP 请求中传输的文件。 此外…

Ceisum无人机巡检直播视频投射

接上次的视频投影&#xff0c;Leader告诉我这个视频投影要用在两个地方&#xff0c;一个是我原先写的轨迹回放那里&#xff0c;另一个在无人机起飞后的地图回显&#xff0c;要实时播放无人机拍摄的视频&#xff0c;还要能转镜头&#xff0c;让我把这个也接一下。 我的天&#x…

Day21-【软考】短文,计算机网络开篇,OSI七层模型有哪些协议?

文章目录 OSI七层模型有哪些&#xff1f;有哪些协议簇&#xff1f;TCP/IP协议簇中的TCP协议三次握手是怎样的&#xff1f;基于UDP的DHCP协议是什么情况&#xff1f;基于UDP的DNS协议是什么情况&#xff1f; OSI七层模型有哪些&#xff1f; 题目会考广播域 有哪些协议簇&#x…

媒体新闻发稿要求有哪些?什么类型的稿件更好通过?

为了保证推送信息的内容质量&#xff0c;大型新闻媒体的审稿要求一向较为严格。尤其在商业推广的过程中&#xff0c;不少企业的宣传稿很难发布在这些大型新闻媒体平台上。 媒体新闻发稿要求有哪些&#xff1f;就让我们来了解下哪几类稿件更容易过审。 一、媒体新闻发稿要求有哪…

Flutter_学习记录_导航和其他

Flutter 的导航页面跳转&#xff0c;是通过组件Navigator 和 组件MaterialPageRoute来实现的&#xff0c;Navigator提供了很多个方法&#xff0c;但是目前&#xff0c;我只记录我学习过程中接触到的方法&#xff1a; Navigator.push(), 跳转下一个页面Navigator.pop(), 返回上一…

mathematical-expression 实现 数学表达式解析 Java 篇(最新版本)

mathematical-expression &#xff08;MAE&#xff09; 切换至 中文文档 Community QQ group 访问链接进行交流信息的获取&#xff1a;https://diskmirror.lingyuzhao.top/DiskMirrorBackEnd/FsCrud/downLoad/18/Binary?fileNameArticle/Image/-56202138/1734319937274.jpg…

http的请求体各项解析

一、前言 做Java开发的人员都知道&#xff0c;其实我们很多时候不单单在写Java程序。做的各种各样的系统&#xff0c;不管是PC的 还是移动端的&#xff0c;还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言&#xff0c;再做业务开发时&#…