当前位置: 首页 > news >正文

C++:初识类与this指针

文章目录

  • 前言
  • 一、类
    • 类的定义和实例化
    • 类的访问限定符
    • 类的作用域
    • 计算类的大小
  • 二、类的成员函数的this指针
  • 总结


在这里插入图片描述

个人主页 : 个人主页
个人专栏 : 《数据结构》 《C语言》《C++》

前言


一、类

类的定义和实例化

在这里插入图片描述
注意类定义结束时后面分号( ; )不能省略。

类体中的内容称为类的成员:

  • 类中的变量称为类的属性or成员变量;
  • 类中的函数称为类的方法or成员函数;

类的两种定义方式

  • 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;  //年int _month; //月int _day;   //日
};

  • 类的声明放在.h文件,成员函数定义在.cpp文件。要注意在类外面定义函数要加上类名::(类的作用域)

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


类的实例化

用类类型创建对象的过程,被称为类的实例化。

  • 类是对对象进行描述的,限定了类有哪些成员,定义一个类并没有分配实际的内存空间。
  • 一个类可以实例化出多个对象,实例化出的对象,占实际的物理空间,存储类成员变量
//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}void Init(int year = 0, int month = 0, int day = 0){_year = year;_month = month;_day = day;}
private:int _year;  //年int _month; //月int _day;   //日
};int main()
{// 类的实例化Date d;d.Init(2023, 9, 3);d.Print();
}

在这里插入图片描述


类的访问限定符

在上面类的定义中,我们看到了 private 和 public这两个关键字就是类的访问限定符。
在这里插入图片描述
访问限定符的作用域:从访问限定符出现的位置开始直到下一个访问限定符出现 或 如果后面没有访问限定符,作用域就到 } 即类的结束为止。

  • public修饰的成员在类外可以直接访问
  • protectedprivate修饰的成员在类外不能直接被访问
  • class的默认访问权限是private,struct的默认访问权限是public

private修饰的成员在类外不可直接访问。
在这里插入图片描述
在这里插入图片描述

public修饰的成员可以在类外直接访问

//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}void Init(int year = 0, int month = 0, int day = 0){_year = year;_month = month;_day = day;}
private:int _year;  //年int _month; //月int _day;   //日
};int main()
{Date d;d.Init(2023, 9, 3);d.Print();//d._year = 0;
}

在这里插入图片描述


类的作用域

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

//日期类
class Date
{
public://打印日期void Print();void Init(int year = 0, int month = 0, int day = 0);
private:int _year;  //年int _month; //月int _day;   //日
};void Date::Init(int year = 0, int month = 0, int day = 0)
{_year = year;_month = month;_day = day;
}void Date::Print()
{cout << _year << "/" << _month << "/" << _day << endl;
}

计算类的大小

类对象的存储方式

  • 只保存成员变量,成员函数存储放到公共代码区
//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}void Init(int year = 0, int month = 0, int day = 0){_year = year;_month = month;_day = day;}
private:int _year;  //年int _month; //月int _day;   //日
};int main()
{Date d1;Date d2;return 0;
}

对于下面代码对象 d1,d2的展示如下:

在这里插入图片描述


那么Date类的大小是多少?
在这里插入图片描述
结论:一个类的大小,实际就是该类中成员变量之和,并且和计算结构体大小一样要注意内存对齐。
注意空类的大小是1。编译器给空类一个字节来标识这个类的对象

结构体内存对齐


二、类的成员函数的this指针

//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}void Init(int year = 0, int month = 0, int day = 0){_year = year;_month = month;_day = day;}
private:int _year;  //年int _month; //月int _day;   //日
};int main()
{Date d1;d1.Init(2023, 9, 3);d1.Print();Date d2;d2.Init(2023, 9, 3);d2.Print();
}

对于上面代码有这样一个问题,我们用Date类实例化了两个对象d1,d2。那么当d1调用Init函数时,该函数如何知道应该设置d1对象,还是d2对象?

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


this指针的特性

  • this指针的类型:类类型* const,即成员函数中,不能改变this的值。
    在这里插入图片描述
    在这里插入图片描述

  • 只能在成员函数内部使用
    在这里插入图片描述

  • this指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针(对象的大小只有成员变量之和)

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

  • 不能在成员函数的形参中显示写出
    在这里插入图片描述


这里出一个题。
对于下面代码的结果是?

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

在这里插入图片描述
结果正常运行。为什么?
因为Print是成员函数并不在对象内部存储,而是在公共代码区存储。编译器并不会区访问nullptr的位置,而是直接去公共代码区找Print函数。
在这里插入图片描述


总结

以上就是我对于C++中初识类与this指针的总结。感谢支持!!!
在这里插入图片描述

相关文章:

C++:初识类与this指针

文章目录 前言一、类类的定义和实例化类的访问限定符类的作用域计算类的大小 二、类的成员函数的this指针总结 个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》 前言 一、类 类的定义和实例化 注意类定义结束时后面分号( ; )不能省略。 类…...

2023应届生java面试紧张失误之一:CAS口误说成开心锁-笑坏面试官

源于&#xff1a;XX网&#xff0c;如果冒犯&#xff0c;表示歉意 面试官&#xff1a;什么是CAS 我&#xff1a;这个简单&#xff0c;开心锁 面试官&#xff1a;WTF&#xff1f; 我&#xff1a;一脸自信&#xff0c;对&#xff0c;就是这个 面试官&#xff1a;哈哈大笑&#xff…...

Excel_VBA程序文件的加密及解密说明

VBA应用技巧及疑难解答 Excel_VBA程序文件的加密及解密 在您看到这个文档的时候&#xff0c;请和我一起念&#xff1a;“唵嘛呢叭咪吽”“唵嘛呢叭咪吽”“唵嘛呢叭咪吽”&#xff0c;为自己所得而感恩&#xff0c;为付出者赞叹功德。 本不想分享之一技术&#xff0c;但众多学…...

Flutter关于StatefulWidget中State刷新时机的一点实用理解

刚入门flutter开发&#xff0c;使用StatefulWidget踩了很多坑&#xff0c;就我遇到典型问题谈谈见解。 1.initState方法只会在控件初始化的时候执行一遍。 2.控件内部执行setState方法&#xff0c;则会每次执行build方法。 3.控件销毁会执行dispose方法&#xff0c;所以一些…...

CS420 课程笔记 P2 - 内存编辑和基础的 GameHacking 尝试

文章目录 IntroductionOperating SystemToolsMemory ScanningMemory ScanExamples!Conclusion Introduction 本节将介绍操作系统的基础知识和内存扫描&#xff0c;这可以说是 game hacking 中最重要的技能&#xff0c;我们不会深入讨论操作系统&#xff0c;因为这本身就是一门…...

【sql】MongoDB 查询 高级用法

【sql】MongoDB 查询 高级用法 一、基本查询指定字段 db.getCollection(students).find({}, {name: 1, score: 1}) 二、指定字段别名 db.getCollection(students).find({}, {"name":1, "score":1, "grade":"$grade.grade"}) 这里将…...

监督学习的介绍

一、定义 监督学习是利用一组已知类别的样本调整分类器的参数&#xff0c;使其达到所要求性能的过程&#xff0c;也称为监督训练或有教师学习。它是一种机器学习的方法&#xff0c;目的是让模型能够从已知的输入和输出之间的关系中学习&#xff0c;并且能够对新的输入做出正确…...

【DRONECAN】(三)WSL2 及 ubuntu20.04 CAN 驱动安装

【DRONECAN】&#xff08;三&#xff09;WSL2 及 ubuntu20.04 CAN 驱动安装 前言 这一篇文章主要介绍一下 WSL2 及 ubuntu20.04 CAN 驱动的安装&#xff0c;首先说一下介绍本文的目的。 大家肯定都接触过 ubuntu 系统&#xff0c;但是我们常用的操作系统都是 Windows&#x…...

Databricks 入门之sql(二)常用函数

1.类型转换函数 使用CAST函数转换数据类型&#xff08;可以起别名&#xff09; SELECTrating,CAST(timeRecorded as timestamp) FROMmovieRatings; 支持的数据类型有&#xff1a; BIGINT、BINARY、BOOLEAN、DATE 、DECIMAL(p,s)、 DOUBLE、 FLOAT、 INT、 INTERVAL interva…...

Simulink建模与仿真(3)-Simulink 简介

分享一个系列&#xff0c;关于Simulink建模与仿真&#xff0c;尽量整理成体系 1、Simulink特点 Simulink是一个用来对动态系统进行建模、仿真和分析的软件包。使用Simulink来建模、分析和仿真各种动态系统(包括连续系统、离散系统和混合系统)&#xff0c;将是一件非常轻松的事…...

(超简单)将图片转换为ASCII字符图像

将一张图片转换为ASCII字符图像 原图&#xff1a; 效果图&#xff1a; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileWriter; import java.io.IOException;public class ImageToASCII {/*** 将图片转换为A…...

In-Context Retrieval-Augmented Language Models

本文是LLM系列文章&#xff0c;针对《In-Context Retrieval-Augmented Language Models》的翻译。 上下文检索增强语言模型 摘要1 引言2 相关工作3 我们的框架4 实验细节5 具有现成检索器的上下文RALM的有效性6 用面向LM的重新排序改进上下文RALM7 用于开放域问答的上下文RALM…...

多种免费天气api

多种免费天气api推荐 一、高德天气二、格点天气三、香港天文台 一、高德天气 api说明文档&#xff1a;https://lbs.amap.com/api/webservice/guide/api/weatherinfo 实例代码&#xff1a; import requests# 香港天文台API的URL api_url "https://restapi.amap.com/v3/w…...

深度学习推荐系统(五)DeepCrossing模型及其在Criteo数据集上的应用

深度学习推荐系统(五)Deep&Crossing模型及其在Criteo数据集上的应用 在2016年&#xff0c; 随着微软的Deep Crossing&#xff0c; 谷歌的Wide&Deep以及FNN、PNN等一大批优秀的深度学习模型被提出&#xff0c; 推荐系统全面进入了深度学习时代&#xff0c; 时至今日&am…...

图神经网络教程之HAN-异构图模型

异构图 包含不同类型节点和链接的异构图 异构图的定义&#xff1a;节点类别数量和边的类别数量加起来大于2就叫异构图。 meta-path元路径的定义&#xff1a;连接两个对象的复合关系&#xff0c;比如&#xff0c;节点类型A和节点类型B&#xff0c;A-B-A和B-A-B都是一种元路径。 …...

Jupyter lab 配置

切换jupyterlab的默认工作目录 在终端中输入以下命令 PS C:\Users\Administrator> jupyter-lab --generate-config Writing default config to: C:\Users\Administrator\.jupyter\jupyter_lab_config.py它就会生成JupyterLab的配置文件&#xff08;如果之前有这个文件的话…...

股票行情处理:不复权,前复权,后复权

不复权的话&#xff0c;K线图能真实反应股价历史的除权信息&#xff0c;缺点是会留有大缺口&#xff0c;股价走势不连续&#xff0c;不能直观感受股价的涨跌波动。 前复权是以目前股价为基准复权&#xff0c;可以很清楚的看到股价的历史高点、低点&#xff0c;以及目前股价所处…...

ip地址、LINUX、与虚拟机

子网掩码&#xff0c;是用来固定网络号的&#xff0c;例如255&#xff0c;255,255,0&#xff0c;表明前面三段必须为网络号&#xff0c;后面必须是主机号&#xff0c;那么怎么实现网络复用呢&#xff0c;例如使用c类地址&#xff0c;但是正常子网掩码是255&#xff0c;255,255,…...

MySQL存储过程

存储过程 1、存储过程简介 存储过程与函数的直接效果类似&#xff0c;只不过存储过程&#xff0c;封装的是一组sql语句。 mysql数据库存储过程是一组为了完成特定功能的sql语句的集合。 存储过程这个功能时从5.0版本才开始支持的&#xff0c;它可以加快数据库的处理速度&…...

element-ui 自定义loading加载样式

element-ui 中的 loading 加载功能&#xff0c;默认是全屏加载效果&#xff0c; 设置局部&#xff0c;需要自定义样式&#xff0c;自定义的方法如下&#xff1a; import { Loading } from element-uiVue.prototype.$baseLoading (text) > {let loadingloading Loading.s…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

虚幻基础:角色旋转

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 移动组件使用控制器所需旋转&#xff1a;组件 使用 控制器旋转将旋转朝向运动&#xff1a;组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转&#xff1a;必须移动才能旋转&#xff0c;不移动不旋转控制器…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南&#xff1a;解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后&#xff0c;许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

ffmpeg(三):处理原始数据命令

FFmpeg 可以直接处理原始音频和视频数据&#xff08;Raw PCM、YUV 等&#xff09;&#xff0c;常见场景包括&#xff1a; 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装&#xff08;如封装为 MP4、TS&#xff09; 处理原始 YUV 视频…...

React、Git、计网、发展趋势等内容——前端面试宝典(字节、小红书和美团)

React React Hook实现架构、.Hook不能在循环嵌套语句中使用 , 为什么&#xff0c;Fiber架构&#xff0c;面试向面试官介绍&#xff0c;详细解释 用户: React Hook实现架构、.Hook不能在循环嵌套语句中使用 , 为什么&#xff0c;Fiber架构&#xff0c;面试向面试官介绍&#x…...