C++初阶 --- 类和对象(1)

类和对象(1)

  • 一、类的相关内容
    • 1.访问限定符
    • 2.class关键字与struct关键字的区别
    • 3.类域
  • 二、this指针
  • 三、成员函数存放在哪里?
    • 1. 函数的存放位置
    • 2. 练习题

一、类的相关内容

1.访问限定符

(1)C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接⼝提供给外部的⽤⼾使⽤。

(2)public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访
问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。

(3)访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到 }即类结束。

(4)class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

(5)⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。
在这里插入图片描述

2.class关键字与struct关键字的区别

(1)class为定义类的关键字,后面跟类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省
略。类体中内容称为类的成员;类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或
者成员函数。
(2)C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是
struct中可以定义函数。

#include<iostream>
using namespace std;
// C++升级struct升级成了类
// 1、类⾥⾯可以定义函数
// 2、struct名称就可以代表类型
// C++兼容C中struct的⽤法//这是c语言结构体的定义:ListNodeC不能代表类型,要加上struct关键字,除非typedef
typedef struct ListNodeC
{struct ListNodeC* next;int val;
}LTNode;// 不再需要typedef,ListNodeCPP就可以代表类型
struct ListNodeCPP
{void Init(int x){next = nullptr;val = x;}ListNodeCPP* next;int val;
};
int main()
{return 0;
}

3.类域

(1)类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作⽤域操作符指明成员属于哪个类域

(2)类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全
局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知
道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。

#include<iostream>
using namespace std;
class Stack
{
public:
// 成员函数void Init(int n = 4);
private:
// 成员变量int* array;size_t capacity;size_t top;
};
// 声明和定义分离,需要指定类域
void Stack::Init(int n)  //缺省值只能在声明定义
{array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申请空间失败");return;}capacity = n;top = 0;
}
int main()
{Stack st;st.Init();return 0;
}

二、this指针

(1)Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,而且成员函数并不属于某一个对象,同类的所有对象共享一份成员函数。那当d1调⽤Init和Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这⾥就要看到C++给了⼀个隐含的this指针解决这⾥的问题。

(2)编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this
指针。⽐如Date类的Init的真实原型为, void Init(Date* const this, int year,int month, int day)。

(3)类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值,
this->_year = year。

(4)C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显⽰使⽤this指针。

#include<iostream>
using namespace std;
class Date
{
public:
// void Init(Date* const this, int year, int month, int day)
void Init(int year, int month, int day)
{//注意:this指针只能指向当前对象
// 编译报错:error C2106: “=”: 左操作数必须为左值
// this = nullptr;_year = year;this->_month = month;this->_day = day;
}
void Print()
{cout << _year << "/" << _month << "/" << _day << endl;
}
private:// 这⾥只是声明,没有开空间int _year;int _month;int _day;
};
int main()
{
// Date类实例化出对象d1和d2Date d1;Date d2;
// d1.Init(&d1, 2024, 3, 31);d1.Init(2024, 3, 31);d1.Print();d2.Init(2024, 7, 5);d2.Print();return 0;
}

三、成员函数存放在哪里?

1. 函数的存放位置

  1. 代码段存储:
    无论是全局函数、静态成员函数、const成员函数还是普通成员函数,在编译后都会被放置在代码段中。这是因为函数代码是共享资源,不需要为每个对象实例都复制一份,更不会直接存储在对象的内存布局中。
  2. 对象不存储函数代码:
    当我们创建一个类的对象时,对象本身只包含其数据成员和可能的虚函数表指针(如果类包含虚函数)。成员函数代码并不存储在对象中。
  3. this指针的作用:
    当成员函数被调用时,编译器会自动传递一个指向调用对象的指针,即this指针。这个指针使得成员函数能够访问和修改对象的数据成员。this指针并不是成员函数的存储位置,而是函数访问对象数据成员的桥梁。
  4. 虚函数和虚函数表:
    如果类包含虚函数,编译器会为每个包含虚函数的类生成一个虚函数表(vtable)。虚函数表包含了指向虚函数实现的指针。对象实例中包含一个指向其所属类的虚函数表的指针(vptr)。当通过基类指针或引用调用虚函数时,会根据虚函数表找到正确的函数实现进行调用。(详情看多态一节)。

例如:
在这里插入图片描述
汇编角度:
在这里插入图片描述

2. 练习题

#include<iostream>
using namespace std;
class A
{
public:void Print(){cout << "A::Print()" << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Python 获取PDF的各种页面信息(页数、页面尺寸、旋转角度、页面方向等)

目录 安装所需库 Python获取PDF页数 Python获取PDF页面尺寸 Python获取PDF页面旋转角度 Python获取PDF页面方向 Python获取PDF页面标签 Python获取PDF页面边框信息 了解PDF页面信息对于有效处理、编辑和管理PDF文件至关重要。PDF文件通常包含多个页面&#xff0c;每个页…

Github配置ssh key原理及操作步骤

文章目录 配置SSH第一步&#xff1a;检查本地主机是否已经存在ssh key第二步&#xff1a;生成ssh key第三步&#xff1a;获取ssh key公钥内容第四步&#xff1a;Github账号上添加公钥第五步&#xff1a;验证是否设置成功验证原理 往github上push项目的时候&#xff0c;如果走ht…

爬虫学习8

Frida是一个动态代码插桩工具&#xff0c;允许开发者在运行时修改和调试应用程序 import ...&#xff1a;这行代码表示导入所需的模块或库&#xff0c;但具体的导入内容在图片中被省略了。 rdev frida.get_remote_device()&#xff1a;这行代码获取一个远程设备实例&#xff…

【动手学电机驱动】STM32-FOC(6)基于 IHM03 的无感方波控制

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…

图像匹配验证码自动检测:基于YOLOv10和传统图像匹配算法

图像匹配验证码自动检测&#xff1a;基于YOLOv10和传统图像匹配算法 图像匹配验证码自动检测&#xff1a;基于YOLOv10和传统图像匹配算法 引言图像采集YOLOv10目标检测图像匹配1.计算两张图像的灰度直方图相似性2. RGB通道分离后的直方图相似度计算3. 感知哈希算法3. 均值哈希算…

POI word转pdf乱码问题处理

1.使用poi 转换word文档成pdf 导入依赖 <dependency><groupId>com.aspose</groupId><artifactId>words</artifactId><version>16.8.0</version></dependency>2.代码实现: SneakyThrowspublic void wordToPdf(String docPath,…

华为云全球加速GA该在什么场景使用呢?

在全球化的商业环境中&#xff0c;企业面临着如何快速、稳定地扩展全球业务的挑战。华为云全球加速&#xff08;GA&#xff09;作为一款高效的全球网络加速服务&#xff0c;致力于帮助企业提升全球用户的访问体验&#xff0c;确保业务的稳定运行。九河云来和大家介绍一下什么是…

【C++】string(一)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的string类&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. 标准库中的string类1.1 string类(了解)1.2 string类的常用接口说明(A) string类对象的…

qt QSyntaxHighlighter详解

1、概述 QSyntaxHighlighter是Qt文本处理框架中的一个强大工具&#xff0c;它专门用于实现文本编辑器中的语法高亮功能。通过自定义高亮规则&#xff0c;QSyntaxHighlighter可以实现对代码编辑器、富文本编辑器中的关键字、注释等内容的高亮显示。这一功能对于提升代码的可读性…

方案丨车险保单OCR:3秒钟完成保单审核

在涉及车辆交易的各种情况下&#xff0c;记录和管理车险保单信息是一项必不可少的任务。然而&#xff0c;面对数量庞大的电子保单&#xff0c;传统的手工录入方式显得尤为低效——它不仅消耗大量时间&#xff0c;而且容易出现错误&#xff0c;这不仅影响了用户的满意度&#xf…

有效提升网站流量的SEO技巧分享

内容概要 在数字时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为提升网站曝光度和吸引访问者的重要工具。SEO的核心目标是通过优化网站的各个方面&#xff0c;提高在搜索引擎结果页面上的排名&#xff0c;从而获得更多的自然流量。有效的SEO策略能够让您在激…

【go从零单排】JSON序列化和反序列化

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;处理 JSON 数据主要依赖于 encoding/json 包。这个包提…

虚幻引擎 CEO 谈元宇宙:发展、策略与布局

在当今科技领域&#xff0c;元宇宙无疑是最热门的话题之一。Epic Games 首席执行官 Tim Sweeney 对元宇宙的未来发展充满信心&#xff0c;他认为开放元宇宙将融合娱乐、游戏和科技产业&#xff0c;带来一个光明的未来。本文将深入探讨采访中的关键内容&#xff0c;分析元宇宙的…

QT自定义控件封装

QT自定义控件封装 1.概述 这篇文章介绍如何创建UI文件&#xff0c;通过自定义方式将两个控件联动起来&#xff0c;实现自定义功能。 2.创建UI文件 新建一个widget的普通项目&#xff0c;然后在项目名称上右键选择And New... 新建文件&#xff0c;然后选择QT 再选择Qt Desig…

王鹤棣演唱会即将泰国开唱,从原点走向未来,兑现与粉丝之约

对喜爱王鹤棣的粉丝来说&#xff0c;12月28日注定是个令人激动的日子&#xff0c;因为这天&#xff0c;王鹤棣即将在泰国曼谷举办D.Party演唱会&#xff0c;这一消息一经官宣&#xff0c;便引发大量中国以及东南亚地区粉丝欢呼&#xff0c;大家对王鹤棣此次演唱会表现出超常热情…

游戏引擎学习第五天

这节貌似没讲什么 视频参考:https://www.bilibili.com/video/BV1Gmm2Y5EwE/ uint8 *A somewhere in memory; uint8 *B somewhere in memory;//BEFORE WE GOT TO HERE int Y *B; // whatever was actually there before the 5 *A 5; int X *B; // 5 //Obviously! Y and …

<项目代码>YOLOv7 草莓叶片病害识别<目标检测>

YOLOv7是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv7具有更高的…

stm32 ADC实例解析(3)-多通道采集互相干扰的问题

文章目录 一、问题现象&#xff1a;二、原因分析&#xff1a;1、测量值不准问题分析&#xff1a;2、采样干扰问题分析 三、解决办法&#xff1a;1、硬件&#xff1a;&#xff08;1&#xff09;、电源供电&#xff08;2&#xff09;、引脚电容&#xff08;3&#xff09;、减少采…

[SaaS] 数禾科技 AIGC生成营销素材

https://zhuanlan.zhihu.com/p/923637935https://zhuanlan.zhihu.com/p/923637935

android studio 轮询修改对象属性(修改多个textview的text)

android studio版本&#xff1a;23.3.1 例程名称&#xff1a;loopsettextviewtext 这几天在帮一个朋友做个数独小游戏&#xff0c;如下图&#xff1a; 要可以玩自定义游戏&#xff0c;点击清空后&#xff0c;所以数字要清除。 要把所有的内容清空&#xff0c;一共有81个text…