C++ 的this指针辨析

news/2024/12/20 7:56:53/

C++ 的 this 指针

指针在这里面是非常难理解的东西,所以要根据例子,自己实践。
在你没有去具体了解之前,不要轻易下结论。
最近,看了《在山的那边》,又有一点新感悟( •̀ ω •́ )✧

this指针

调用成员函数时,成员函数通过一个名为 this 的隐式参数来访问调用它的那个对象,用请求该函数的对象地址初始化 this ,this 的指向总是自己这个对象,所以 this 是一个常量指针

Box* get_address()   //得到this的地址
{return this;
}
Box* get_address()   //得到this的地址
{Box box;this = &box; // error: lvalue required as left operand of assignmentreturn this;
}

在 C++ 中,this 指针是一个隐式传递给非静态成员函数的常量指针,用于指向调用该函数的对象。以下是对你的代码和 this 的特性总结:

特性:
  1. this 是一个隐式指针
    • 每个非静态成员函数都有一个隐式的 this 指针,用来访问调用该成员函数的对象。
    • this 指针的类型为 ClassName* const,即常量指针,不能被修改。
  2. this 指针的用途
    • 访问成员变量和成员函数。
    • 返回对象自身的地址。
    • 在需要对象指针的场景下传递 this
  3. 静态成员函数中没有 this 指针
    • 静态成员函数不与任何特定对象绑定,因此没有 this 指针。

代码分析
  1. 正确的用法

    Box* get_address() // 返回当前对象的地址
    {return this;
    }
    

    解释

    • 函数中 this 指针指向调用该函数的对象。
    • 返回 this 时即返回调用该函数的对象地址。
    • 这是一个有效的用法。
  2. 错误的用法

    Box* get_address() 
    {Box box;this = &box; // 错误: 赋值操作试图修改 `this`return this;
    }
    

    错误原因

    • this 是一个常量指针,不能被赋值。
    • this 的作用是固定指向当前调用对象,任何试图修改 this 都会导致编译错误。

总结
  • this 指针的值是无法更改的,它始终指向当前对象。
  • 如果需要返回一个新对象的地址,应该直接返回新对象的地址而不是试图修改 this

正确示例:

Box* create_new_box()
{Box* box = new Box();return box; // 返回新对象的地址
}

http://www.ppmy.cn/news/1556604.html

相关文章

10.1k高星 GitHub 库:告别JSON错误:Outlines如何提升大模型的结构化输出

在人工智能和大语言模型(LLM)的应用中,如何高效、可靠地从模型输出中提取结构化数据,成为了一个至关重要的课题。本篇文章将介绍 GitHub 高星开源库 Outlines,并分析它如何帮助开发者解决大模型在生成结构化数据时面临的挑战。我们将探讨大模型的非结构化输出给 AI 应用带…

Fiddler勾选https后google浏览器网页访问不可用

一、说明 最近电脑重新安装系统后,之前的所有工具都需要重新安装和配置,有个项目需要抓包https包查看一下请求的内容,通过Fiddler工具,但是开启后,发现https的无法抓取,同时google浏览器也不无法访问互联网…

深空之眼3.9新版本今日更新 修正者天卫·海姆达尔上线

在深空之眼这款游戏中,3.9新版本【临界效应】今日正式上线了,今天就给大家介绍一下新版本的一些内容! 新修正者 圣树能量型,S级水属性修正者【天卫海姆达尔】已经跟随版本更新正式上线,大家可以 新换装 1.玄机执明全…

笔记--(Shell脚本04)、循环语句与函数

循环语句 1、for语句的结构 for 变量名 in 取值列表 do 命令序列 done for 收件人 in 邮件地址列表 do 发送邮件 done for i in {1..10} doecho $i done[rootlocalhost shell]# ./ce7.sh 1 2 ...... 9 101 #!/bin/bash2 3 for i in seq 1 104 do5 echo $i6 done[rootlocal…

SpringBoot 开启热部署 项目热启动 一键调试无需 无需重启

依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope> <!-- 只在开发环境下使用 --> </dependency>Idea设置 设置完后&#xff0c;修…

谓词下推、逻辑优化、列剪枝

1.谓词下推&#xff08;Predicate Pushdown Optimization&#xff0c;PPO&#xff09; 1.1 基本概念与例子 谓词下推&#xff08;Predicate Pushdown&#xff09; 是数据库查询优化中的一种技术&#xff0c;它将查询中的谓词&#xff08;通常是 WHERE 子句、JOIN 条件等&…

Windows 小记 13 -- 如何正确获取 UIAccess

UIAccess 特权允许应用访问辅助应用程序的 UI 所在的窗口带。通俗点讲&#xff0c;UIAccess 获取后&#xff0c;具有 WS_EX_TOPMOST 样式的窗口将始终置顶&#xff08;高于任何应用&#xff09;。 网络上获取 UIAccess 的一般方法是通过复制特权进程的令牌&#xff0c;并赋予 …

MVCC了解

MVCC&#xff08;多版本并发控制&#xff09;学习指南及代码示例 一、学习MVCC前先了解什么 1. MVCC的定义和作用 MVCC是一种并发控制机制&#xff0c;用于解决并发事务访问数据库时可能出现的问题&#xff0c;如脏读、不可重复读和幻读。它通过为每个数据行维护多个版本来实…