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

文章目录

  • 一、类的定义
    • 1.类定义格式
    • 2.访问限定符
    • 3.类域
  • 二、实例化
    • 1.实例化概念
    • 2.对象⼤⼩
  • 三、 this指针

一、类的定义

1.类定义格式

与定义结构体类似

class ST
{//成员变量int val;//成员函数void print(){cout << val << endl;}};

class为定义类的关键字,ST为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。

为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_或者m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看要求。

C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。

定义在类里⾯的成员函数默认为inline。

2.访问限定符

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

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

• 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到 } 即类结束。
• class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

• ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。

class ST
{
public://成员函数void print(){cout << val << endl;}
private://成员变量int val;
};

3.类域

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

#include <iostream>
using namespace std;class ST
{
public://成员函数void print(){cout << val << endl;}
private://成员变量int val;
};int main()
{ST st;st.print();return 0;
}

二、实例化

1.实例化概念

⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。

是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。

#include <iostream>
using namespace std;class ST
{
public://成员函数void print(){cout << val << endl;}
private://成员变量int val;//只是声明,没有开空间
};int main()
{//ST类实例化出对象st,现在才开空间ST st;st.print();return 0;
}

⼀个类可以实例化出多个对象,实例化出的对象占⽤实际的物理空间,存储类成员变量。打个⽐⽅:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房⼦才能住⼈。

在这里插入图片描述
同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。

2.对象⼤⼩

类对象在内存中的存储方式如下图,类成员函数存放在公共代码区,因为每次调用的类成员函数都是同一个函数,没必要再分到各个对象中,而每个对象中的成员变量可能不同,所以它们分别存。

类里面的成员函数是不占内存的,只有成员变量占内存,并且符合内存对齐规则

内存对⻬规则

• 第⼀个成员在与结构体偏移量为0的地址处。
• 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
•注意:对⻬数 = 编译器默认的⼀个对⻬数与该成员⼤⼩的较⼩值。
• VS中默认的对⻬数为8
•结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
•如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。

在这里插入图片描述

#include <iostream>
using namespace std;class ST
{
public:void print(){cout << val << endl;}
private:double k;int val;};int main()
{ST st;cout << sizeof(st) << endl;return 0;
}

在这里插入图片描述
注意如果类里面只有成员函数时,它的实例化对象的大小为1
为什么没有成员变量还要给1个字节呢?因为如果⼀个字节都不给,怎么表⽰对象存在过呢!所以这⾥给1字节,纯粹是为了占位标识对象存在

#include <iostream>
using namespace std;class ST
{
public:void print(){cout << "val" << endl;}
};int main()
{ST st;cout << sizeof(st) << endl;return 0;
}

在这里插入图片描述

三、 this指针

C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数,让该指针指向当前对象,在函数体中所有“成员变量”的操作,都是通过该指针去访问,但用户不需要传递,由编译器自己完成。

this指针就是一个隐含的指针,它存在于每个非静态成员函数中,并指向调用该成员函数的对象实例。

this指针的特点

  • this指针是* const型的指针,即 类名* const,所以成员函数中不改变this指针的指向

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

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

#include <iostream>
using namespace std;class ST
{
public://void print(ST* const this)void print(){cout << this->val << endl;}void set(int x){val = x;}
private:int val;
};int main()
{ST st;st.set(1);//st.print(&st);st.print();return 0;
}

在这里插入图片描述
注意:this指针不存在于内存中某一特定区域,因为它在函数当中,所以在使用时会创建在栈中

this指针可以为空,但是只能在不涉及解引用操作的前提下,因为空指针不能解引用

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

在这里插入图片描述
如果使用空指针的解引用就会使程序崩溃在这里插入图片描述

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

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

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

相关文章

SQL笔试题【数据岗】

视频号数据分析组外包招聘笔试题时间限时 45 分钟完成 题目 根据 3 张表表结构&#xff0c;写出具体求解的 SQL 代码 &#xff08;搞笑品类定义&#xff1a;视频分类或者视频创建者分类为“搞笑”&#xff09; l 题目 1&#xff1a;输出一张搞笑品类 dws 表&#xff0c;用于分…

从 QWebEnginePage 打印文档

QWebEnginePage 是 Qt WebEngine 模块中的一个类&#xff0c;它提供了用于处理网页内容的接口。如果你想要打印 QWebEnginePage 中的内容&#xff0c;你可以使用 QPrinter 和 QPrintDialog 类来实现。 项目配置了 Qt WebEngine 模块&#xff0c;并且在你的.pro文件中包含了相应…

el-date-picker 禁用 之前 和 之后 的时间

<el-date-pickerv-model"ruleForm.startTime"type"date"placeholder"请选择"format"YYYY-MM-DD"value-format"YYYY-MM-DD":disabled-date"pickerOptions"clearable/>const pickerOptions (time) > { if…

解析 pdfminer pdfparser.py

解析 pdfminer pdfparser.py 1. 导入必要的模块2. 定义PDFParser类2.1 初始化方法2.2 设置文档方法2.3 处理关键词方法举例说明: 3. 定义PDFStreamParser类3.1 初始化方法3.2 刷新方法3.3 处理关键词方法 总结 今天我们来看一段Python代码,这段代码实现了一个PDF文件的解析器。…

Python项目开发实战,掷硬币的连胜,案例教程编程实例课程详解

在Python中进行实战项目,比如模拟掷硬币并记录连胜次数,是一个既有趣又能加深理解随机数生成、循环控制、条件判断等编程基础的好方法。下面,我将逐步引导你完成一个详细的Python项目,该项目将模拟掷硬币的过程,并追踪记录连胜的次数,同时我们会深入探讨一些编程概念,如…

查看尝试登服务器ssh 访问ip地址

不指定时间查看尝试登录服务器的SSH访问IP地址 # CentOS/RHEL系统 zgrep "sshd" /var/log/secure-* | grep "Failed password" | awk {print $(NF-3)} | sort | uniq -c | sort -nr | head -n 10检查过去7天的日志尝试登录服务器的SSH访问IP地址 # CentOS…

AutoMQ vs Kafka: 来自小红书的独立深度评测与对比

测试背景 当前小红书消息引擎团队与 AutoMQ 团队正在深度合作&#xff0c;共同推动社区建设&#xff0c;探索云原生消息引擎的前沿技术。本文基于 OpenMessaging 框架&#xff0c;对 AutoMQ 进行了全面测评。欢迎大家参与社区并分享测评体验。 01 测试结论 本文主要测评云…

AI克隆声音,基于函数计算部署GPT-Sovits语音生成模型

阿里云的 https://developer.aliyun.com/adc/scenario/808348a321844a62b922187d89cd5077 还是 函数计算 FC (aliyun.com) 选择 语音克隆生成 GPT-SOVITS 通过访问域名就能访问 就可以上传个人的声音&#xff0c;然后进行输出 。

【逆向基础】十、逆向工具分享之DIE(Detect It Easy)

一、简介 DIE&#xff08;Detect It Easy&#xff09;是一款可以轻松检测PE文件的程序&#xff1b;其主要作用是查壳&#xff0c;并将pe文件的内容解析出来&#xff0c;包括PE文件中包含的导入函数、导出函数的名称及地址&#xff0c;入口函数地址等&#xff0c;是技术人员分析…

C# —— 数组的告诫查询方法

查询数组元素的方法 1.通过索引值找元素 a[0] 2.通过循环进行遍历 查询数组的每一个元素 int[] a1 new int[] { 1, 2, 3 }; Console.WriteLine(a1[0]);// 通过循环进行遍历 查询数组的每一个元素 for (int i 0; i < a1.Length; i) {// Console.WriteLine(a1[i]); } 3 in…

nuPlan 是一个针对自动驾驶车辆的闭环机器学习(ML-based)规划基准测试

nuPlan: A closed-loop ML-based planning benchmark for autonomous vehicles nuPlan 是一个针对自动驾驶车辆的闭环机器学习&#xff08;ML-based&#xff09;规划基准测试 Abstract In this work, we propose the world’s first closed-loop ML-based planning benchmar…

乐观锁原理

乐观锁是一种并发控制的方法&#xff0c;主要用于多线程环境下&#xff0c;用于保证数据的一致性。其核心思想是&#xff1a;"在多个事务中乐观地读取数据&#xff0c;在提交时再验证是否有冲突&#xff0c;如果没有&#xff0c;则提交&#xff1b;如果有&#xff0c;则回…

Excel第30享:基于辅助列的条件求和

1、需求描述 如下图所示&#xff0c;现要统计2022年YTD&#xff08;Year To Date&#xff1a;年初至今日&#xff09;各个人员的“上班工时&#xff08;a2&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 Step1&#xff1a;确定逻辑。“从日期中提取出…

sqlmap确定目标/实操

安装kali&#xff0c;kali自带sqlmap&#xff0c;在window系统中跟linux系统操作有区别 sqlmap是一款自动化SQL工具&#xff0c;打开kali终端&#xff0c;输入sqlmap&#xff0c;出现以下界面&#xff0c;就说明sqlmap可用。 sqlmap确定目标 一、sqlmap直连数据库 1、直连数据库…

26.Labview波形图、XY图、强度图使用精讲

我们如何使用Labview显示曲线或者制作出下面这种我们想要的曲线并随着我们输入值的变化而变化呢&#xff1f; 本文详细讲解一下每种波形图的使用方式&#xff0c;帮助大家深入了解波形图的使用技巧。 文章中所有程序均可在百度网盘下载&#xff0c;下载方式&#xff1a;复制下…

GPT生成文本的实际案例 - Transformer教程

大家好&#xff0c;今天我们要聊一聊一个非常有趣的话题——GPT生成文本的实际案例&#xff0c;并且通过这篇文章来了解一下Transformer教程。这些技术在自然语言处理&#xff08;NLP&#xff09;领域掀起了巨大的波澜&#xff0c;不仅改变了我们与计算机交互的方式&#xff0c…

单件s_instance作为类成员静态变量与函数静态局部变量的区别

在C中&#xff0c;静态成员变量和静态局部变量虽然都是静态的&#xff0c;但它们的作用和使用方式有明显的区别&#xff1a; 1. **静态成员变量**&#xff1a; - 静态成员变量是类的一部分&#xff0c;它是类的所有实例对象共享的&#xff0c;只有一份拷贝。通常在类的声明…

虚拟机 VMware Workstation- 安装详细步骤

目录 虚拟化概念VMware Workstation 简介一、安装准备1. 安装环境2. 软件下载 二、常见问题1. 虚拟机的【默认位置】会在C盘&#xff0c;盘符内存不够的建议改为D盘或别的盘符2. 验证许可证是否密钥是否成功。进入虚拟机点击【帮助】下的关于VMware Workstation(A)可以查看验证…

YOLOv10改进 | 主干/Backbone篇 | 利用RT-DETR特征提取网络PPHGNetV2改进YOLOv10

一、本文介绍 本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv10的主干&#xff0c;RT-DETR是今年由百度推出的第一款实时的ViT模型&#xff0c;其在实时检测的领域上号称是打败了YOLO系列&#xff0c;其利用两个主干一个是HGNet一个是ResNet&#xff0c;其中HGNet就是我们…

Java项目中,常用的SQL语句

常用的命令&#xff1a; 1.数据的增删改查 1.插入数据(进行注册&#xff09; 语法 1&#xff1a; --第一种&#xff1a; INSERT INTO 表名(列名 1,列名 2, …) ; insert into tablename(member1,member3) valuse(,); --第二种&#xff1a; INSERT INTO 表名 VALUES(值 1,值 …