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

【直击招聘C++】2.5 this指针

2.5 this指针

  • 一、要点归纳
    • 1.什么是this指针
    • 2.this指针的深入讨论
      • 程序1
      • 程序2
    • 3.类成员函数返回对象和返回对象引用的区别
  • 二、面试真题解析
    • 面试题1
    • 面试题2

一、要点归纳

1.什么是this指针

  this指针是隐含于每一个类对象的特殊指针,该指针值是一个正在被某个成员函数操作的对象的地址。
  this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来每个对象都拥有自己的成员函数,所以this指针在成员函数开始执行钱构造,在成员函数执行结束后清除。只有获得一个对象后才能通过对象使用this指针,而且this指针只有在成员函数中才有定义。
例如有以下程序:

#include <iostream>class Test
{int n;public:Test() {}Test(int m) { n = m; }void addvalue(int m){Test s1;s1.n = n + m;*this = s1;}void disp() { std::cout << "n=" << n << std::endl; }
};int main()
{Test s(10);s.disp();s.addvalue(5);s.disp();return 0;
}

程序的执行结果如下:

n=10
n=15

Test类中定义了一个addvalue的非静态成员函数,在调用它时需要写成:

Test s;
s.addvalue(5);

也就是说需要告诉系统是将s对象的私有数据成员n增大5,而不是其他对象。它实际上相当于以下函数调用。

addvalue(&s,5);

即将类对象的地址作为第1个参数传递给了函数。addvalue函数的原型相当于:

void addvalue(Test * this, int m);

该函数的第1个参数是指向该类对象的一个指针,即this指针。在定义该成员函数时并没有看到这样一个参数,因为这个参数是系统隐含的。在成员函数的定义体中可以通过this访问这个地址参数。如果不用this指针,该成员函数等同于如下代码:

void addvalue(int m)
{n+=m;
}

this指针只能用在类的非静态成员函数中使用,它指向该成员函数被调用的对象。静态成员函数没有this指针,因为类只有一个静态成员函数的副本,所以使用this指针没有什么意义。

2.this指针的深入讨论

程序1

class A
{int n;public:A() { n = 1; }void fun() { std::cout << "n=" << this->n << std::endl; }
};
void test02()
{A *p = NULL;// p->fun();
}

上述程序中A的成员函数放在代码区,对应有一个地址,在链接时将调用fun函数的地方用这个地址代替,并传递this指针。类Test的对象指针p为NULL,所以this指向没有意义的实例,在执行p->fun()时由于访问this->n导致程序崩溃。

程序2

class B
{int n;public:B() { n = 1; }void fun() { std::cout << "fun" << std::endl; }
};
void test03()
{B *p = NULL;p->fun();
}

上述程序可以正确执行,并输出fun。fun函数中并没有this指针,所以不存在链接问题,不会报错。如果在fun函数中访问this指针,或者访问任何非静态数据成员都会导致程序崩溃。

3.类成员函数返回对象和返回对象引用的区别

下面通过一个实例说明返回对象和返回对象引用的类成员函数的区别。

class C
{int m;public:C() : m(1) {} // 默认构造函数~C() {}       // 析构函数C fun1(){std::cout << "m=" << m << std::endl;return *this;}C &fun2(){std::cout << "m=" << m << std::endl;return *this;}void set(int x) { m = x; }void display() { std::cout << "m=" << m << std::endl; }
};
void test04()
{std::cout << "===返回对象===" << std::endl;C c1;c1.fun1().set(2);c1.display();std::cout << "===返回对象引用===" << std::endl;C c2;c2.fun2().set(2);c2.display();
}

在上述程序中类C有fun1()和fun2()两个公有成员函数,其中 C fun1()是返回C对象的成员函数,而C& fun2()是返回C对象引用的成员函数,两个成员函数的函数体相同。执行test04函数的主要语句过程如下:

  • C c1语句调用默认构造函数创建c1
  • c1.fun1().set(2)语句先执行c1.fun1(),输出m=1,返回当前对象,并调用拷贝构造函数创建一个临时对象,再通过这个临时对象调用set(2),将这个临时对象的m修改为2,该语句执行完毕。调用析构函数销毁这个临时对象,而c1没有发生任何改变。
  • c1.display()语句输出m=1
  • C c2语句调用默认构造函数创建c2
  • c2.fun2().set(2)语句首先执行c2.fun2(),输出“m=1”,由于fun2()函数类型的对象引用,其执行结果为对象c2,再调用set(2),等同于c2.set(2),将对象c2的m修改为2。
  • c2.display()输出m=2
  • test04函数执行完毕,调用两次析构函数销毁对象c2和c1。

二、面试真题解析

面试题1

【面试题】下面程序段中包含4个函数,其中具有隐含this指针的是(f4)

int f1();
class  T
{public:static int f2();private:friend int f3();protected:int f4();
};

【答】类中的静态成员函数和友元函数不含this指针,普通非成员函数也不含this指针。

面试题2

【面试题】在成员函数中return *this和return this有何不同?
【答】对于类A,其成员函数中return *this返回的是当前对象的副本或者本身(若成员函数的返回类型为A,则是返回副本;若成员函数的返回类型为A&,则是返回本身),而return this返回当前对象的地址(指向当前对象的指针)。

相关文章:

【直击招聘C++】2.5 this指针

2.5 this指针一、要点归纳1.什么是this指针2.this指针的深入讨论程序1程序23.类成员函数返回对象和返回对象引用的区别二、面试真题解析面试题1面试题2一、要点归纳 1.什么是this指针 this指针是隐含于每一个类对象的特殊指针&#xff0c;该指针值是一个正在被某个成员函数操作…...

spark数据清洗练习

文章目录准备工作删除缺失值 > 3 的数据删除星级、评论数、评分中任意字段为空的数据删除非法数据hotel_data.csv通过编写Spark程序清洗酒店数据里的缺失数据、非法数据、重复数据准备工作 搭建 hadoop 伪分布或 hadoop 完全分布上传 hotal_data.csv 文件到 hadoopidea 配置…...

Android 12首次开机启动Launcher前黑屏问题解析

在工作中&#xff0c;对于系统开发确实有些难度&#xff0c;特别是在开机阶段遇到的问题&#xff0c;比如开机动画播放完毕进入锁屏界面黑屏几秒然后进入 锁屏界面&#xff0c;这就需要根据开机日志来分析问题所在&#xff0c;在工作中遇到的几种黑屏情况做下记录首次开机进入L…...

使用 LSSVM 的 Matlab 演示求解反常微分方程问题(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 LSSVM的特性 1) 同样是对原始对偶问题进行求解&#xff0c;但是通过求解一个线性方程组&#xff08;优化目标中的线性约束导致…...

动态规划-背包问题

文章目录一、背包问题1. 背包问题简介2. 背包问题解决方法二、01 背包问题1. 实现思路2. 实现代码三、完全背包问题1. 实现思路2. 实现代码四、多重背包问题&#xff08;一&#xff09;1. 实现思路2. 实现代码五、多重背包问题&#xff08;二&#xff09;1. 实现思路2. 实现代码…...

计算24点与运算符重载

十几年前写过一个算24点的程序。记得当时有点费劲&#xff0c;不过最后总算捣鼓出来了。前几天突然想再写一次&#xff0c;结果轻松地写出来了。C&#xff0c;总行数不多&#xff0c;带命令行界面和注释共200行不到&#xff1b;利用了面向对象和运算符重载来简化代码。 首先谈…...

MES系统智能工厂,搭上中国制造2025顺风车

MES在电子制造业中的应用日益广泛&#xff0c;越来越多的厂商已经购置或自行开发了MES&#xff0c;并将其作为“智能化工厂”。国内大大小小、各行各业都有上百个MES系统&#xff0c;还有很多的国外MES系统&#xff0c;怎么才能在MES系统公司中找到适合自己的MES&#xff1f;希…...

【LeetCode】每日一题(1)

目录 题目&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 写在最后&#xff1a; 题目&#xff1a; 这是他给出的接口&#xff1a; class Solution { public:int fillCups(vector<int>& amount) {} }; 作为一个数学学渣&#xff0c;我想不出厉害的数学算法…...

SpringCloud-Netflix学习笔记11——Hystrix实现服务降级

服务降级 是什么&#xff1f; 整体资源快不够了&#xff0c;忍痛将某些服务先关掉&#xff0c;待渡过难关&#xff0c;再开启回来。 如下图&#xff0c;在某一个时间段&#xff0c;访问服务A的请求特别多&#xff0c;而访问服务B和服务C的请求特别少&#xff0c;这时我们可以把…...

Oracle Dataguard(主库为 Oracle rac 集群)配置教程(03)—— 创建 dataguard 数据库之前的准备工作

Oracle Dataguard&#xff08;主库为 Oracle rac 集群&#xff09;配置教程&#xff08;03&#xff09;—— 创建 dataguard 数据库之前的准备工作 / 本专栏详细讲解 Oracle Dataguard&#xff08;Oracle 版本为11g&#xff0c;主库为双节点 Oracle rac 集群&#xff09;的配置…...

零代码做分析报表的bi软件才是好软件

有些数据分析软件对IT的依赖比较重&#xff0c;在制作报表的过程中需要用到SQL&#xff0c;这就导致了IT人员懂技术不懂业务&#xff0c;业务人员懂业务不懂技术&#xff0c;数据分析做来做去总是差点什么的局面。要是遇到了IT部门相对较弱的情况&#xff0c;还会加重IT负担&am…...

linux ALSA 驱动架构

一、kernel Audio驱动架构主流有两大类&#xff0c;一类是SOC Machine架构&#xff0c;另一类是simple-card架构。 MTK、QCom主要采用machine架构&#xff0c;rockchip采用simple card架构。 二、Machine架构驱动介绍 machine 架构每家平台实现并不完全相同&#xff0c;mach…...

JDK 8 JVM内存结构详解

前言 本文所介绍的是 JDK 1.8 版本&#xff0c;其他版本的 JDK 在这里并不一定正确&#xff1b;内容主要摘自周志明的《深入理解Java虚拟机》一书的关键点&#xff0c;并根据自身的理解进行记录。感兴趣的同学可以去阅读原著。 JVM 的内存结构&#xff0c;主要包括以下 5 个区…...

黑马程序员 Linux 教程

目录Linux 简介不同应用领域主流操作系统Linux 系统历史Linux 系统版本Linux 安装安装方式网卡设置安装 SSH 连接工具使用 FinalShell 连接到 LinuxLinux 和 Windows 目录结构对比Linux 目录介绍Linux 常用命令Linux 命令初体验Linux 命令使用技巧Linux 命令格式文件目录操作命…...

文件操作 -- IO

文章目录文件操作 -- IO文件 :文件路径 :文件的类型java 中的文件操作文件内容的相关操作字节流的读和写操作字符流的读和写操作代码案例代码案例一 &#xff1a;代码案例二 &#xff1a;代码案例三 &#xff1a;文件操作 – IO 文件 : 文件相比大家都不陌生把 &#xff0c; 打…...

FPGA解析串口协议帧3.0版本,增加了错误重发功能,提供仿真文件以及源码

FPGA解析串口协议帧已经发布2个版本了&#xff0c;分别如下&#xff1a; 版本1&#xff1a;点击查看版本1 版本1详细介绍了串口协议帧的帧组成和设计思想&#xff0c;但设计粗糙&#xff0c;注释不详细&#xff1b; 版本1&#xff1a;点击查看版本2 版本2优化了代码&#xff0c…...

365天深度学习训练营 第P6周:好莱坞明星识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 内部限免文章&#xff08;版权归 K同学啊 所有&#xff09;&#x1f366; 参考文章地址&#xff1a; &#x1f517;第P6周&#xff1a;好莱坞明星识别 | 365天深度学习训练营&#x1f356; 作者&#xff1a;K同学啊 | 接…...

一文读懂 Zebec Chain 的“先行网络” Nautilus 链

最近&#xff0c;Zebec 上线了 DAO 治理系统后&#xff0c;上线并通过了关于 Nautilus 链的提案&#xff0c;这也是DAO系统上线后通过的首个提案。 Nautilus 链可以被看作是Zebec Chain上线前的“先行”链&#xff0c;并且是目前行业内为数不多的以“Layer3”作为特点的模块化通…...

FuzzyMathematicalModel模糊数学模型-2-多目标模糊综合评价案例分享

主函数&#xff1a;clc, clear% 输入模糊矩阵的原型x [4700 6700 5900 8800 76005000 5500 5300 6800 600004.0 06.1 05.5 07.0 06.80030 0050 0040 0200 01601500 0700 1000 0050 0100];r muti_objective_fuzzy_analysis(x);% 各指标在决策中占的权重(专家系统&#xff0c;自…...

单链表--C语言版(从0开始,超详细解析,小白一看就会)

目录 一、前言 &#x1f34e; 为什么要学习链表 &#x1f4a6;顺序表有缺陷 &#x1f4a6; 优化方案&#xff1a;链表 二、链表详解 &#x1f350;链表的概念 &#x1f349;链表的结构组成&#xff1a;节点 &#x1f353;链表节点的连接&#xff08;逻辑结构与物理结构的区…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...