【C++】类和对象(1)

C++:类和对象1 /类体,由成员函数和成员变量组成//注意有分号,这个和结构体相同class为定义类的关键字,classname为类的名字,{}中为类的主体,着重注意类后面的分号不能省略。类体中的内容称为类的成员,类中的变量称为类的成员变量或者类的属性,类中的函数称为类的方法或者成员函数。int num;char name;方法如果直接在类里面定义默认就是内联。在一个.h文件中public:public:int a;int num;char name; 阅读详情

【C++】类和对象(1)
【C++】类和对象(2)


前言


浅浅了解

一、面向过程和面向对象

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题.
比如洗衣服这件事:
在这里插入图片描述

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
在这里插入图片描述


二、 类和对象的关系

上面洗衣服的模型,有4个对象:人、衣服、洗衣粉、洗衣机。
我们对于这些对象是如何定义的呢?是通过类来定义的。

类是对象的模板或蓝图,对象则是类的实例化,即根据类创建出来的具体实体。
简单说:类是房子设计图,对象是房子

三、创建类和对象

那我们如何定义一个类呢?如下
在这里插入图片描述
具体如下:
在这里插入图片描述
在类中,我们不但可以定义成员变量即上面的a,top,capacity,可以定义成员函数即上面的Init(),push()。
其中成员函数可以定义在类的外面,声明在类的里面。
在这里插入图片描述


创建一个对象并使用成员函数
在这里插入图片描述


其中stack是一个类,st是stack的一个实例对象。


逐步深入

看完上面如何创建一个类、对象,你肯定有很多疑惑。为什么类会有成员函数?类为什么会有public,private? 类外定义成员函数为什么要使用作用域解析运算符::?下面我们开始渐渐深入了解。

一、类的访问限定符

以前在C语言中,我们使用结构体来自定义类型,但使用结构体有一些弊端。假如我们现在定义一个数据结构 - 栈。
在这里插入图片描述
同理,StackPush(),StackPop()……都可以不用写函数,直接访问结构体成员就可以了。即使数据结构要求使用函数,但你并没有禁止直接访问结构体成员。于是c++之父对结构体的访问做出一些规定,即添加了访问限定符

在c++中,结构体被升级为了类,不过我们一般不用结构体来定义类,而是用一个新的关键字class来替代struct。

c++的访问限定符有以下三种:
在这里插入图片描述
public - 表示可以在外界访问。
private - 表示只能在类里访问。
protected, - 表示只能在类和该类的派生类里访问。

在两个访问限定符之间的内容,它的访问权限为第一个访问限定符。
在这里插入图片描述
如下:
在这里插入图片描述
这时,你就只能通过类的成员函数来改变了。


二、 封装

面向对象的三大特性:封装、继承、多态。
在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑
真正工作的却是CPU、显卡、内存等一些硬件元件。

类中添加成员函数,目的是为了将相关的数据和操作封装在一起,使得数据和操作成为一个整体,从而更好地组织代码和实现功能。成员函数可以访问和修改类的成员变量,也可以进行复杂的计算和逻辑操作,对外部提供更为友好的接口。
同时,使用成员函数还能够实现面向对象编程的一些基本特性,例如封装、继承、多态等,更好地体现了面向对象编程的思想。另外,成员函数也可以作为类之间进行交互和通信的接口,方便实现各个类之间的协同工作。


三、类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。

当你在外界定义成员函数时,需要使用::来指明函数属于哪一个类域。

class Person
{
public:
 void PrintPersonInfo();
private:
 char _name[20];
 char _gender[3];
 int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
 cout << _name << " "<< _gender << " " << _age << endl;
}

四、类对象模型

对于一个类的,我们该如何计算它的大小呢?
这和计算结构体的大小一致。

结构体对齐规则:
结构体(struct)的数据成员, 第一个数据成员存放的地址为结构体变量偏移量为0的地址处.
其他结构体成员自身对齐时, 存放的地址为min{ 有效对齐值为自身对齐值, 指定对齐值 } 的最小整数倍的地址处.
注 : 自身对齐值 : 结构体变量里每个成员的自身大小
注 : 指定对齐值:有宏 #pragma pack(N)指定的值, 这里面的 N一定是2的幂次方.如1, 2, 4, 8, 16等.
如果没有通过宏
在32位Linux主机上默认指定对齐值为4, 64位的默认对齐值为8,
AMR CPU默认指定对齐值为8;
vs-8
注:有效对齐值:结构体成员自身对齐时有效对齐值为自身对齐值与指定对齐值中 较小的一个.
总体对齐时, 字节大小是min{ 所有成员中自身对齐值最大的, 指定对齐值 } 的整数倍.

在这里插入图片描述
类的大小的计算方式也是这样,但是类新增了成员函数,成员函数的大小难道不计算吗?这就要先了解一下类的存储方式了。

在这里插入图片描述
请问类采用哪种存储方式?
答案是第三种,成员函数不放在对象中,而是放在公共代码段。
我们只用测试一下类的大小就知道了。
在这里插入图片描述
可见,成员函数并没有计算在其中,至于为什么,其实想想也很知道,如果每个对象都自带函数,这就太浪费,不如每一个对象都共用同一个函数。

对于一个空类,它的大小规定为1字节。
在C++中,空类的大小虽然没有定义成员变量,但是由于每一个实例都应该拥有一个唯一的地址,因此编译器为其分配了一个字节的空间以确保该类的每一个对象都具有唯一的地址。
空类继承其他类或者包含虚函数时,所占用的空间将取决于继承或虚函数表的大小,而不是定为1字节。在这里插入图片描述


五、this指针

对于成员函数,你是否有下面的疑惑?
在这里插入图片描述
答案:很显然不是,成员函数里的a是实例对象里的a,类里面的成员变量只是“图纸”。
那这里就有一个问题了,成员函数里的成员变量是实例对象里的成员变量,上面又说,成员函数是放在公共代码段,所有对象共用,那成员函数是怎么区分?
在这里插入图片描述

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

在这里插入图片描述
编译器进行了暗箱操作,也就是说,你设置的成员函数都自带一个隐形参数,只不过你看不到,而且不允许你手动加上。
this指针的特性

  1. this指针的类型:类的类型* const,即成员函数中,不能给this指针赋值。

  2. 只能在“成员函数”的内部使用,不允许你添加在函数实参/形参里在这里插入图片描述

  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。
    所以对象中不存储this指针。

  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用
    户传递


根据this指针的特性,回到以下两个问题:

  1. this指针存在哪里?
  2. this指针可以为空吗?

答案:this指针存储在栈上,因为它是形参。
this指针可以为空,但要满足一定条件
在这里插入图片描述


告别降级CUDA!手把手教你为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly + vLLM推理环境 本文详细指导如何为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly和vLLM推理环境,特别针对CUDA 12.8的适配问题提供解决方案。从硬件准备到源码编译,再到模型部署与性能调优,手把手教你构建高效AI推理系统。 阅读详情

相关推荐

BugkuCTF-PWN题pwn2-overflow超详细讲解

解题思路 1)计算出get_shell_的地址偏移量 2)算出来之后就直接溢出到后门函数 知识点 x64函数调用规则 解题之前我们先学下linux x64的函数调用规则。 x64机器在调用某个函数前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余参数存入到栈里,保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里,然后一次入栈h

am_03的博客 3013

cpp.1 C++类和对象(上)

文章目录第一部分 C++入门1.命名空间2.缺省参数3.函数重载4.引用 第一部分 C++入门 1.命名空间 命名空间实际上就是为了防止命名相同会导致很多的冲突,可以使用命名空间对标识符进行本地化,来避免命名的冲突 使用方式: 1.加命名空间名称及作用域限定符std::cout<<"hello world"<<std::endl; 2.使用using将命名空间中成员引入using std::cout; 3.用using namespace 命名空间名称引入using namespac

Pinksatrfish的博客 368

TwinCAT 3 实战指南:从系统配置到高级运动控制

本文详细介绍了TwinCAT 3工业自动化控制平台的实战应用,从系统配置、PLC编程到EtherCAT总线配置和高级运动控制。通过倍福(Beckhoff)的TwinCAT 3平台,工程师可以高效实现复杂的工业自动化任务,包括运动控制、PLC编程等。文章还提供了常见问题排查和性能优化技巧,帮助用户提升系统稳定性和实时性。

weixin_30831529的博客 304

【C++】类和对象——Lesson1

类、类的默认成员函数

小羊的博客 3210

Unity工业数据可视化:基于ModbusTCP的实时数据通信实战

本文详细介绍了在Unity中实现工业数据可视化的核心方法,重点讲解了基于ModbusTCP协议与PLC等工业设备进行实时数据通信的实战流程。内容涵盖NModbus库的集成、Modbus Slave模拟器的使用、TCP连接的建立与多线程安全通信、数据读写与解析,以及如何将实时数据驱动3D场景,为构建工业数字孪生与监控系统提供完整解决方案。

ol7890123的博客 554

多跳问答技术解析:从原理到金融领域实践

多跳问答(Multi-hop QA)是自然语言处理中的高级任务,要求系统通过多步推理整合分散信息来回答问题。其核心技术在于理解文档间的复杂关联,相比单跳问答需要更精细的数据集设计和模型架构。在金融、医疗等专业领域,多跳问答能有效处理如'腾讯大股东投资的港股上市公司'这类需要串联多个信息点的问题。典型实现方案包括MR-Search框架的三级检索器设计,分别处理实体召回、关系匹配和数值比较。当前最佳实践表明,结合稠密检索与稀疏检索的混合策略,配合动态路由机制,能在保持较高精度的同时控制计算成本。这类技术在金融风

weixin_42566072的博客 606

C++——类和对象(1)

猛攻C++新语法——类和对象。带你领略C++的语法之美

yang_xinxim的博客 727

OCR文字识别领域经典论文总结

本篇将介绍文字识别经典论文,内容包括文字检测、文字识别、端到端识别等方法,具体将分别对论文算法简介、思路、代码等几个部分展开介绍。目前各部分只举例经典论文,算法没有全部写完,后续会将在此部分基础上更新更多论文综述及代码实战部分。.................................

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 1万+

【C++】类和对象(1)

C++类和对象,内存对齐,this指针,

Xie_sheng的博客 1791

训练救星!EMA多尺度注意力让YOLOv11轻松攻克自定义数据集不涨点难题

在目标检测模型训练中,自定义数据集不涨点是阻碍算法落地的核心痛点之一。传统训练策略在数据分布特殊、样本量有限的场景下极易陷入收敛停滞,而 EMA(指数移动平均)结合多尺度注意力的方案,在自定义数据集上实现mAP 提升 6.5%,同时让训练曲线从“平缓停滞”转为“持续攀升”,彻底解决创新点在自有数据上的性能瓶颈。本教程将带你从原理到实践,通过 EMA 多尺度注意力为 YOLOv11 注入训练稳定性,让你的自定义数据集模型训练实现质的飞跃。EMA 衰减率:小样本数据集建议将decay。

FJN110的博客 160

OpenHarmony WebView引擎:从Chromium魔改到分布式渲染的终极解析

ArkWeb框架提供了强大的Web应用开发能力,但同时也需要注意网络安全问题,尤其是跨域请求方面。

m0_67505153的博客 1195

【C++语法】类和对象(1)

本文围绕C++类和对象展开。介绍对象概念,对比C与C++编程范式;讲解类定义、访问限定、作用域、实例化;说明类存储大小含内存对齐,即便无成员变量也占1字节;还阐述this指针特性,它是成员函数隐式形参。

feng_qi0325的博客 1129

【异常】Cursor报错We‘re having trouble connecting to the model provider. This might be temporary

在使用Cursor编辑器进行AI交互操作时,界面弹出如下报错提示,导致无法正常调用模型服务,影响使用流程:We’re having trouble connecting to the model provider. This might be temporary - please try again in a moment. 该报错核心含义为Cursor编辑器无法正常连接至背后的AI模型服务提供商(如OpenAI、Anthropic等),属于连接类异常,并非编辑器本身运行故障。经排查,该报错不具备破坏性,仅

奶爸的编程之路,也就一周冷个三天 1690

C++类和对象1

1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理。内联函数:在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。内联函数实际可以理解为空间换时间,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。

2401_86164065的博客 1972

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++实验三——类和对象(1)

实验报告题目1题目2题目3 【实验名称】 实验三 类和对象(1) 【实验内容】 题目1 设计一个用于描述三维空间中的点的类,为其设计必要的成员变量和函数,并尽量增强其功能。 #include<iostream> #include<math.h> using namespace std; class Point { public: Point(){} Point (string name,double x,double y,double z){

Onlyone_1314的博客 1675

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

CPP类和对象(1)

CPP类和对象(1)

m0_68981107的博客 144

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ 类和对象1

类型:由成员函数 和 成员变量组成,后面一定要加上分号!class为定义类的关键字ClassName为类的名字,{ } 中是类的主体注意类定义结束时后面的分号是不能省略的。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1.声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可以会将其当成内联函数处理。2.类声明放在 .h 文件中,成员函数定义放在.cpp文件中。

yun2739_love的博客 921

【C++】类和对象1

本篇文章主要介绍类与对象的基础知识 -- 类的概念与定义、对象的概念与实例化、this指针

L_0907的博客 927

【c++】类和对象1

1.上面的那种方法,定义和声明都在类里面2.定义和声明分开stack.cppreturn;_top = 0;// 扩容++_top;_top = 0;int* _a;int _top;源.cppint main()stack st;st.init(4);st.Push(1);st.Push(2);st.Push(3);

yyqzjw的博客 1290

C++ 类和对象(1)

接下来C++就要给我们上强度了,类和对象。这里不要问为什么,要多记忆哦,更多的是接受祖师爷(本贾尼·斯特劳斯特卢普)的想法。在 C++ 中,类(class)是一种用户定义的数据类型,它允许将数据(成员变量)和操作这些数据的函数(成员函数)封装在一起。类的定义可以包含构造函数、析构函数、公有成员、私有成员、静态成员、常量成员、类型定义等。•class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量。

2302_80867815的博客 1172

C++——类和对象1

系统设的机制,B和C都是空类,虽然B有成员函数,成员函数不占空间,1 是为了占位,表示对象存在过,如果1个字节都不给的话,怎么能表示这个对象定义出来了呢?C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是不能在实参或形参的位置显示的加,但是可以在函数里面使用 why?---->之后会提到。所以用this指针在调用同一个函数,访问到了不同的变量,但是不能在实参或形参的位置显示的加,但是可以在函数里面使用 why?成员函数的地址不在对象里面,那成员函数的地址又是声明时候确定的呢?

2302_80045891的博客 945
上一篇: 【C++】6. 内联函数
下一篇: 【C++】7. auto和nullptr(c++11)
ProcedureStone
博客等级 码龄4年 254粉丝 64原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值