首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 类与对象——超详细入门指南(上篇)

类通过将数据和行为封装在一起,模拟现实世界中的实体。通过类,我们可以定义对象的属性(成员变量)和行为(成员函数)。 1.1 类定义的基本格式 类的定义使用 class 关键字,后面跟上类的名称。...封装性:相比C语言,C++通过类的 private 成员变量 _array、_capacity 和 _top,将栈的实现细节封装起来,防止用户直接操作这些数据。...安全性:C++中的类通过 private 关键字保护类的内部数据,防止外部代码随意修改类的成员变量,增强了数据的安全性。...这是因为 int 变量 _i 要求4字节对齐,而 char 只占1字节,因此在 char 后面会插入3个字节的填充空间,以便 int 对齐到4字节边界。 拓展解释:为什么需要内存对齐?...解释 通过使用 #pragma pack(1) 指令,我们将类 B 的内存对齐设置为 1 字节对齐。

5100

【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)

其次,c++规定,对象的成员变量才存储时要符合结构体的内存对齐规则。 规则如下: 1.结构体的第一个成员对齐到和结构体的起始地址的偏移量为0的地址处,也就是说第一个成员的偏移量记为0。...2.其他的成员要对齐到该成员的对齐数整数倍的地址处。...在函数的实参和形参中,这个this指针会自动在参数第一个位置生成,我们不能显示地写出来;但是在函数体内我们可以使用this指针。 2. this指针只能在成员函数内部使用。...原因是:这里创建类指针a,并且调用函数Print。可以看到程序中虽然使用了“->”,但是并没有对空指针a进行解引用,本质是将a传递给了形参this指针。...和上一道题相同,本质也是将a传给了形参this,但是函数内部却访问了成员变量_a,我们都知道_a本质是由this指针解引用访问到的,但是此时的形参this是空指针,所以就出现了对空指针解引用的问题,运行崩溃

19010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++学习————第四天(类、this指针)

    其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。...如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。...4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递,this指针是非静态成员函数的隐含形参....例如: 4、防止同名变量的误操作 在C++ 成员函数中,当成员函数中某个变量与成员变量名字相同,就容易产生误操作,则使用this关键字来表示成员变量,防止误操作。...,所以不能加点,this指针不需要显示地定义,编译器会自动添加。

    9710

    分享8个提高工作效率的Excel技巧

    一、一列变多列,多列变一列 1.如图所示:在E1单元格输入公式=D8,引用D列的第8个单元格 2.拖动,将E1的公司复制到划定区域。...点击播放 GIF 0.1M 四、跨列居中 说起表格中的标题居中,很多人的做法是直接合并单元格,设置居中,其实还有一种更加简单的方法,即选中多列单元格—设置单元格格式—“对齐”—“跨列居中”,不妨试一试?...点击播放 GIF 0.2M 六、两行合并成一行 先将行宽设置到足够宽,能放下合并的所有文字内容,点击“开始”—“填充”—“两端对齐”(内容重排),即可将两行合并成一行。...如下图,扩展选定区域以后,姓名会跟着分数一起变动位置,防止出现姓名与分数对应不上的情况。...点击播放 GIF 0.2M 八、快速美化表格 选中表格内容—点击“开始”—“套用表格样式,选择自己喜欢的表格样式,快速美化表格。

    94110

    【C++篇】类与对象的秘密(上)

    2.2 对象的大小与内存对齐 对象的大小由成员变量决定,成员函数不影响对象的大小。 类实例化出的每个对象,都有独⽴的数据空间,所以对象中肯定包含成员变量,那么成员函数是否包含呢?...结构体对齐详细介绍可参考我的另一篇博客 。 三、this 指针 this指针是C++中的一个隐含指针,指向调用成员函数的当前对象。它存在于每一个非静态成员函数中,用于区分成员变量和函数参数。...当成员函数被调用时,this指针会自动传递给函数,使其能够访问调用该函数的对象的成员。 3.1 this指针的基本用法 在成员函数中,this指针用于访问当前对象的成员变量。...2.自动内存管理:利用构造函数和析构函数自动管理内存,无需手动调用初始化和销毁函数。 3.访问控制:可以使用private关键字将类的内部数据隐藏,防止外部直接访问,确保数据安全。...4.代码简洁:操作栈时不需要手动传递结构体指针,成员函数会自动使用this指针访问类的成员。

    13110

    C++类与对象深度解析(一):从抽象到实践的全面入门指南

    类通过将数据和行为封装在一起,模拟现实世界中的实体。通过类,我们可以定义对象的属性(成员变量)和行为(成员函数)。 1.1 类定义的基本格式 类的定义使用 class 关键字,后面跟上类的名称。...封装性:相比C语言,C++通过类的 private 成员变量 _array、_capacity 和 _top,将栈的实现细节封装起来,防止用户直接操作这些数据。...安全性:C++中的类通过 private 关键字保护类的内部数据,防止外部代码随意修改类的成员变量,增强了数据的安全性。...这是因为 int 变量 _i 要求4字节对齐,而 char 只占1字节,因此在 char 后面会插入3个字节的填充空间,以便 int 对齐到4字节边界。 拓展解释:为什么需要内存对齐?...解释 通过使用 #pragma pack(1) 指令,我们将类 B 的内存对齐设置为 1 字节对齐。

    17110

    【C++】C++入门 — 类和对象初步介绍

    其实与结构体类似,具有相同的对齐规则, 第一个成员在与结构体偏移量为0的地址处。 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。...如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍 面试题: 结构体怎么对齐? 为什么要进行内存对齐?...只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成 特性: this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。可以保护好指针内容。...this指针 是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递 【面试题】 this指针存在哪里? this指针可以为空吗?...总之,正常情况下,程序员应该避免让this指针处于空状态,确保在成员函数调用期间对象的有效性。如果需要检查this是否为空,可以在成员函数开始时添加适当的断言来防止潜在的问题。、

    12210

    【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹

    对象的大小并不仅仅是简单地将类中非静态成员变量的大小相加,还受到内存对齐、填充字节以及类中是否包含虚函数等因素的影响 2.3.1、决定对象大小的因素 对象的大小只包括类中非静态数据成员(成员变量)所占的内存空间...内存对齐: 编译器会为数据成员添加填充字节,以确保数据对齐符合系统要求。 对象大小的计算涉及到内存对齐,我们先来理解什么是内存对齐? 2.3.2、内存对齐 为什么需要内存对齐?...如果数据不对齐,CPU 需要执行额外的操作来读取数据,影响性能。 内存对齐的规则: 第⼀个成员在与结构体偏移量为0的地址处。 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。...return 0; } 编译器会自动将 this 指针传递给成员函数,因此在函数内部可以访问调用对象的成员。...obj 的地址存储到 ECX(this 指针) call MyClass::func ; 调用 func,this 指针已传入 在调用 func() 之前,编译器会将 obj 的地址存储到寄存器

    41110

    OOPC精要——撩开“对象”的神秘面纱

    这样可以有效的防止可能被不知道谁访问的全局变量。...这样可以有效的防止可能被不知道谁访问的全局变量。...结构体内部,成员变量自动对齐到自己的大小——这就会导致空隙的产生。 结构体内部,成员变量可以通过 attribute ((packed))单独指定对齐方式为byte。...当你用掩码结构体声明结构体变量的时候,这个变量多半不是对齐到word的而是对齐到了任意的字节地址上。...更具文章《漫谈C变量——对齐(1)》和《漫谈C变量——对齐(2)》中的介绍,当我们我们用指针访问结构体时,如果指针默认的对齐方式与对象实际的对齐方式不符时,就会引发“非对齐访问”——轻则性能下降,重则触发

    86911

    C语言—scanf和printf的介绍

    1.print 1.1基本用法 printf()的作用是将参数文本输出到屏幕。它的名字里的f代表format(格式化),表示可以定制输出文本的格式。 比如想让屏幕上输出Hello world!...输出的值默认是右对齐,即输出的内容前面会有空格;当然有右对齐就会有左对齐,左对齐就是在输出内容的后面添加空格。可以在占位符%后面添加一个负号。...程序运行到scanf()这个函数值时会停下来等待用户输入。用户输入数据,按下回车键后,scanf()会处理用户的输入数据,将其存为变量。它的原型和printf一样也是定义在头文件stdio.h中。...注意:变量前必须加上&运算符(指针变量除外),&是一个取地址符号。因为scanf传递的是地址,而不是具体的值。 如果这些变量都是指针变量(比如字符串变量),就不需要加&。...scanf() 遇到 %s 占位符,会在字符串变量末尾存储⼀个空字符 \0 。 scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。

    16510

    C++打怪升级(四)- 类和对象入门1

    this指针本质上是成员函数的形参,当对象调用成员函数时,将类对象的地址作为实参传递给this形参,所以对象中不存储this指针 。...---- 结构体内存对齐 第一个成员在与结构体偏移量为0的地址处; 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处;注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。...结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍; 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数...this指针本质上是成员函数的形参,当对象调用成员函数时,将类对象的地址作为实参传递给this形参,所以对象中不存储this指针 。...每个方法不需要传递Stack*的参数了,由编译器自动传递给隐式的this指针,编译器编译之后该参数会自动还原,即C++中 Stack *参数是编译器维护的,C语言中需用用户自己维护。

    51510

    剖析【C++】——类与对象(上)超详解——小白篇

    内存对齐规则: 第一个成员在与结构体偏移量为 0 的地址处:即第一个成员从 0 地址开始。 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处:对齐数是编译器默认对齐数和成员大小的较小值。...结构体总大小为最大对齐数的整数倍:即所有成员变量类型最大值和默认对齐参数的最小值的整数倍。 嵌套结构体:嵌套的结构体对齐到自己的最大对齐数的整数倍处,整体大小为所有最大对齐数的整数倍。...: char 对齐到 1 字节 int 对齐到 4 字节 double 对齐到 8 字节 计算大小: a 从偏移量 0 开始,占 1 字节。...this 指针由编译器维护:this 指针是成员函数的第一个隐含的指针形参,编译器会自动处理,不需要用户传递。...,使用时不需要显式传递 Stack 指针,因为编译器会自动处理 this 指针。

    12510

    sizeof 知多少?

    14,但这只是s1各个成员经过内存对齐之后的结果,我们还需要对s1进行一次“整体”填充,考虑到s1中最大的成员大小为4(s1.m_1和s1.m_3),由于14并不能整除4,所以需要在结构体末尾再填充2个字节...看来我们又再次遗漏了什么东西… 这次的问题是出在我们之前总结的公式上,由于之前我们仅考虑了基本类型,所以公式中大量使用了sizeof(Mi)这种形式, 但实际上,我们真正需要的是alignof(Mi)这种表达(即某个成员变量的对齐值...而现在我们引入了结构体形式的成员变量,sizeof(Mi) = alignof(Mi)这个前提便不再成立了,套用之前的公式自然也无法获得正确答案… 不过我们依然可以通过alignof来修正之前总结的计算公式...,vptr会置于类型的内存布局首部(继承类会复用基类的虚函数表指针),然后放置基类的数据成员,最后放置继承类的数据成员,放置方法仍然遵循之前所讲的对齐和填充规则,所以我们仍然可以套用公式来计算cv2的大小...首先放置B1的虚函数指针(I会复用该虚函数表指针) b. 接着放置B1的数据成员,并逐个执行内存对齐 c. 接着放置B2的虚函数指针(如果有的话) d.

    52300

    谈对象系列:C++类和对象

    在变量名前加上下划线 在变慢名前加上字母m 类的两种定义方法 将函数的定义和声明放在类里面实现: 这里使用class定义了一个日期类,在main函数里声明了一个day1对象,使用点操作符(.)...结构体内存对齐的原则: 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处(上述两个结构体c1偏移量为0的原因) 其它成员变量要对齐到对齐数的整数倍的地址处。...对齐数:编译器默认的第一个对齐数 与 该成员变量大小的较小值。 vs中默认—8 linux中gcc 没有默认对齐数,对齐数就是成员自身大小。 结构体中每个成员变量都有一个对齐数。...如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员中的对齐数)的整数倍。...不添加并不代表不存在this指针 外界无法传入当前对象的地址给到被调用的成员函数,使用this指针接受当前对象的地址,,this指针就会通过不同的地址去找到内存中对应的成员变量。

    11210

    【烧脑技术贴】无法回避的字节对齐问题,从八个方向深入探讨(变量对齐,栈对齐,DMA对齐,结构体成对齐,Cache, RTOS双堆栈等)

    指针变量是4字节对齐。...在M内核里面,局部变量的对齐问题如果研究起来是最烧脑的,这个涉及到AAPCS规约(Procedure Call Standard for the Arm Architecture, Arm架构的程序调用标准...比如我们设置的8字节对齐,那么中断发生的时候,如果SP指针位置在4字节对齐,那么硬件自动插入4字节来保证8字节对齐,之后就是硬件自动入栈的寄存器开始存入栈中。...比如我们使用支持单精度浮点的M4内核芯片,测试代码如下: MDK直接给你来个不对齐硬件异常: 八、RTOS的任务栈: RTOS的任务栈涉及到双栈指针问题,SP(R13寄存器)有两个栈指针...大家网上搜关键词FatFS SDIO DMA,也是一瓢的问题,特别是BMP等格式图片显示的时候,这种问题就来了,因为很难保证每次的读取都是4字节对齐的。

    1.4K30

    3.格式IO

    字符串 %c 单个字符 %p 指针(地址)的值 %e 指数形式的浮点数 %x,%X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法 ━━━━━━━━━━━━━━...4)其它注意 (1)超过说明的场宽 如果字符串的长度或整型数位数超过说明的场宽,将按其实际长度输出。对浮点数,若整数部分位数超过了说明的整数位宽度,将按实际整数位输出。...6.地址列表 地址是由若干个地址组成的列表,可以是变量的地址、字符串的首地址、指针变量等,各地址间以逗号间隔。...格式输入函数执行结果是将键盘输入的数据流按格式转换成数据,存入与格式相对应的地址指向的存储单元中。 7.三个scanf函数 ?...对于%d格式,如果指定了域宽,则从键盘上输入数据时,数据之间不加分隔符(如空格等),由系统按给定的域宽自动截取数据。

    94320

    【C++掌中宝】类和对象(一):类的定义和实例化

    1.1 类的定义 1.1.1 类定义格式 class为定义类的关键字,Stack为类的名字(类名由自己决定,这里以下面例子为例),{}中为类的主体,注意类定义结束时后面分号不能省略。...通常,成员变量会被设置为private或protected以实现封装,防止外部代码直接修改这些属性。...其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数与该成员大小(所占字节)的较小值。...VS中默认的对齐数为8 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。...如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

    19010
    领券