Cpp中的this指针--复习记录

1.什么是this指针?

    每个类都有一个this指针,我们的非静态成员函数可以通过这个this指针来操作对象的成员属性。this指针存储的就是类的实例的地址,this指针时时刻刻指向的都是这个实例对象本身。

由下图可知:

我在主函数中栈上创建了一个类的实例(由操作系统自动回收释放),然后再用s调用learn打印出当前this指针的地址,由终端可见,此时类对象地址与this指针的地址是相同的。

这样我们知道了this指针的基本概念,再来说说他的具体用途:

 1.当形参和成员变量同名时

可以用this指针来区分。如下图所示 ,这样就可以将传入的sum值赋值给类的成员变量。

2.在类的非静态成员函数中返回对象本身,可以使用return *this来返回当前对象的引用,这种技术被称为链式调用(chaining),它允许在调用对象的成员函数后,直接继续调用另一个函数。

链式调用的好处:

  • 代码简洁清晰: 可以在一行代码中完成多个对象状态的修改,使代码更加紧凑。
  • 可读性增强: 易于理解对象状态的设置顺序和逻辑。
  • 便于使用 fluent API: 在设计 fluent interface 时非常有用,提供一种流畅的接口风格。
  • Fluent Interface 是一种优雅的设计模式,通过返回对象自身的引用实现了链式调用,提升了代码的可读性和编写效率。它特别适合用于需要频繁进行多步设置的场景,能够简化代码结构,使其更具表达力和清晰度。

3.看看这一段代码

他可以正常打印输出吗?

    class A{int i;public:void Hello() { cout << "hello" << endl; }};int main(){A * p = NULL;p->Hello(); //结果会怎样?}

答案是可以的,你可能会好奇,明明p是空指针,为什么还能正常打印呢?

实际上每个成员函数的第一个参数默认都有个指向对象的 this 指针,上述情况下如果该指向的对象是空,相当于成员函数的第一个参数是NULL,那么只要成员函数没有使用到成员变量,也是可以正常执行。

但倘若加上i ,就会报错啦。因为this指针是空的,使用了空的指针指向了成员变量i,程序就会奔溃。

3.要注意,静态成员函数不可以使用this指针,因为静态成员函数相当于是共享的变量,不属于摸个对象的变量,而this存储的是对象的地址,它指向的就是对象,所以静态成员函数它是没有this指针的。

说到这了,

2.什么是static,它的用法有哪些呢?

static是从C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。

引入static:

我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配内存空间,函数在栈上分配的内存空间在此函数结束之后就会被释放掉,这样就产生了一个问题,如果想将函数中的变量保存值下一次调用时,改如何实现呢? 最容易想到的方法是定义一个全局的变量,但定义一个全局的变量有许多缺点,最明显的缺点就是破坏的次变量的访问范围,(使得此函数的变量不仅仅只受此函数的控制),static关键字则可以很好的解决这个问题。

另外,在C++中如果需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见时,可以将其定义为静态数据。

将成员变量和成员函数设置为static,他就不属于任何对象,而是属于这个类了,被类的实例所共享,成员变量分为

1.可见类内静态成员需要在类外进行初始化,(C++11标准之前),现在可以将静态成员在类内进行初始化,只不过需要加上const。

static的基本用法:

1、被 static 修饰的变量属于类变量,可以通过类名::变量名直接引用,而不需要 new 出一个类来

2、被 static 修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要 new 出一个类来而非静态成员不可以直接用类名直接调用。

使用static的几种情况总结:

  1. 修饰变量

  • 全局变量:

  • 链接属性由外部变成内部,即对其他文件不可见,只能在本文件使用。

  • 局部变量:

  • 作用域不变,生命周期变成整个程序的执行周期,在内存中的位置由栈区变为全局静态区。退出作用域,该变量不可访问,但是仍在内存中;如果再次进入作用域,则读取上次的结果继续使用。

  • 成员变量:

  • 必须在类外初始化(static成员变量先于类的对象存在,static程序启动时就在内存中,而对象需要等到执行到的时候才会在内存中),该变量在类的所有对象中共享,只存在一份。可以通过类名+作用域的形式访问。

  1. 修饰函数

  • 普通函数:

  • 链接属性由外部变成内部,即对其他文件不可见,只能在本文件使用。

  • 成员函数:

  • 该函数在类的所有对象中共享,只存在一份,可以通过类名+作用域形式访问。没有this指针无法声明为虚函数、常函数,无法直接访问非静态成员变量(可通过对象的方式访问),无法调用非静态成员函数。如下图所示:

3.const的作用:

基本概念:

const允许我们指定一个语义约束,告诉编译器某个对象不应该被改变,而编译器会帮助我们实施这一项约束,如果我们认定某个值不能被改变,那么我们就应该使用const,来让编译器帮助我们来保证这个条件不会被违反。

适用场景:

const可以修饰很多内容,对于修饰变量,可以修饰局部的(必须立刻初始化,否则编译错误),全局的(默认初始化为0)或者成员变量(必须使用构造函数的初始化列表进行初始化),对于函数,可以修饰函数的返回值,函数的参数,对于指针,可以修饰指针本身,也可以修饰指针所指向的对象;对于类,可以修饰类的成员变量,也可以修饰类的成员函数。

举例说明:

比如我们重写一个操作符*,我们就应该把这个函数的返回值设置为const,因为我们知道这个操作符的返回值是不可以更改的,这样就可以避免一些错误的语法,比如a*b=c,(可能我们只是想判断a*b和c是否相等,但是误写成了=)。

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

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

相关文章

【Python-实操】LabelMe to YOLOv8 Converter

LabelMe to YOLOv8 Converter 这是一个 Python 脚本&#xff0c;用于将 LabelMe 标注工具导出的 JSON 文件转换为 YOLOv8 格式的标注文件&#xff0c;并同时在图像上绘制标注的多边形。 功能 读取 LabelMe JSON 文件。解码并显示图像。从 classes.txt 文件加载类别标签。将多…

Java | Leetcode Java题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; class Solution {public int countRangeSum(int[] nums, int lower, int upper) {long sum 0;long[] preSum new long[nums.length 1];for (int i 0; i < nums.length; i) {sum nums[i];preSum[i 1] sum;}BalancedTree treap ne…

Java参数传递

Java参数传递 一、 方法重载 一个类中可以存在多个同名的方法&#xff0c;只要这些方法的参数列表不同即可。 参数列表不同&#xff1a;参数个数或者参数类型不同方法重载与修饰符、返回值类型等统统无关&#xff0c;只看参数列表 二、 可变个数的形参 从Java5.0开始&…

陶瓷材质的防静电架空地板越来越受欢迎的原因

目前市面上的陶瓷防静电架空地板主要分为两种&#xff1a;钢基和硫酸钙基。前者是以全钢冲孔裸板作为板基&#xff0c;经粘接、固定整型和灌浆的方式加工而成&#xff0c;后者是以复合硫酸钙板为基材&#xff0c;表面粘接防静电陶瓷砖&#xff0c;四周导电PVC边条封边。近年来陶…

【C++】vector 的模拟实现

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

02_快速启动 Demo 创建 Electron 项目、electron-forge 搭建一个 electron 项目、手动创建electron项目

快速启动 Demo 创建 Electron 项目 一、克隆一个仓库、快速启动一个项目二、electron-forge 搭建一个 electron 项目三、手动搭建一个 electron 项目四、开发工具中配置 Eslint 一、克隆一个仓库、快速启动一个项目 要使用 git 的话首先电脑上面需要安装 git //克隆示例项目的…

Qt3D给圆环等立体图形添加纹理图片

添加纹理图片&#xff0c;首先需要自己找一个纹理图&#xff0c;当然了&#xff0c;随便什么图片都行。 创建3D图形的主要步骤查看另一篇文章。 这里主要代码如下&#xff1a; 使用QTextureLoader加载图片&#xff0c;图片路径需为qrc:/的路径。 auto *planeTransform1 ne…

嵌入式学习day13(C高级Linux命令)

一丶进程管理命令 1.grep 功能&#xff1a;从文件中查找字符串 格式&#xff1a;grep "要查找的字符串" 文件名 精确查找&#xff1a;grep "\<要查找的字符串\>" 文件名 结合ps以及管道&#xff1a;ps -ef | grep a.out: 从进程信息中查找带…

10个理由告诉你,为什么鸿蒙是下一个职业风口!

在当今科技飞速发展的时代&#xff0c;新的技术和趋势不断涌现&#xff0c;为人们带来了前所未有的机遇和挑战。鸿蒙操作系统作为我国自主研发的创新成果&#xff0c;正逐渐成为科技领域的焦点&#xff0c;被认为是下一个职业风口。 10个理由告诉你&#xff0c;为什么鸿蒙是下一…

【海贼王航海日志:前端技术探索】CSS你了解多少?(二)

目录 1 -> 字体属性 1.1 -> 设置字体 1.2 -> 字体大小 1.3 -> 字体粗细 1.4 -> 文字样式 2 -> 文本属性 2.1 -> 文本颜色 2.1.1 -> 认识RGB 2.1.2 -> 设置文本颜色 2.2 -> 文本对齐 2.3 -> 文本装饰 2.4 -> 文本缩进 2.5 -&g…

vue的nextTick是下一次事件循环吗

如题&#xff0c;nextTick的回调是在下一次事件循环被执行的吗&#xff1f; 是不是下一次事件循环取决于nextTick的实现&#xff0c;如果是用的微任务&#xff0c;那么就是本次事件循环&#xff1b;否则如果用的是宏任务&#xff0c;那么就是下一次事件循环。 我们看下Vue3中…

【Canvas与艺术】黄色立体感放射光芒五角星

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>黄色立体感放射光芒五角星</title><style type"text/c…

Html详解——Vue基础

HTML是什么&#xff1f; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用来结构化 Web 网页及其内容的标记语言。网页内容可以是&#xff1a;一组段落、一个重点信息列表、也可以含有图片和数据表…

[Vue]Vue3从入门到精通-综合案例分析

一.Vue是什么&#xff1a; 概念&#xff1a;Vue是一个用于构建用户界面的渐进式的框架 以下的内容是自里向外的 声明式渲染(Vuejs核心包)组件系统(Vuejs核心包)客户端路由VueRouter大规模状态管理Vuex构建工具Webpack/Vite Vue的两种使用方式&#xff1a; Vue核心包开发-&…

DSL domain specific language of Kola

How we design Kola - ApiHugKola background, Kola a consumer driver tester frameworkhttps://apihug.com/zhCN-docs/kola/003_dsl_contract Concept 在 Kola 定位中 Kola 是什么, 是致力于提供一个让相关各方都能够理解共同创造的测试框架和工具。 同时 Kola 是建立于业界…

node中使用http创建web服务器

1.案例代码 // 1.导入http模块 const http require(http)// 2.创建web服务器实例 const server http.createServer()// 3.为服务器实例绑定request事件&#xff0c;监听客户的请求 server.on(request,function(req,res){console.log(欢迎来到服务器);// req.url是客户端请求…

Kubernets(k8s) 网络原理二:Pod访问外网

上一篇文章中&#xff0c;我们介绍了pod与宿主机通信&#xff0c;并且通过network namespace模拟了通信过程。回顾整个流程&#xff0c;无非就涉及到两个东西&#xff0c;通信设备和路由规则。 本文要讲的&#xff0c;也离不开这两个东西&#xff0c;只不过需要对容器IP进行额…

学习c语言第24天(练习)

编程题 第一题 最大公约数最小公倍数求和 //求最大公约数和最小公倍数之和 //暴力求解 //int main() //{ // int n 0; // int m 0; // while (scanf("%d %d", &n, &m)2) // { // int min n < m ? n : m; // int max n > m ? n : m; //…

Stable Diffusion 使用详解(7)---AI 摄影

目录 背景 底模的选择 例子 majicMix GirlFriendMix&#xff08; Lora&#xff09; 对比效果 LEOSAMs MoonFilm ADetailer 使用 说明 例子 问题 处理方式 效果 背景 魔法师使用魔法作的画有时候太过完美&#xff0c;以至于有点脱离真实摄影的感觉&#xff0c;我们…

【电控笔记z14z16】增加霍尔元件分辨率

霍尔传感器用的不多?实际增量编码器更好 z14 假设60度内速度不变 z16(更简单的方法)BLDC