c与c++区别之this指针的巧妙应用

感知this指针 人工传递this指针技巧 引入 C++与C明显的不同之处就是C++对类(class)的支持,这也是C++最初被称作C with classes的原因。我们知道类是属性和行为的封装,它既包含成员变量,也包含成员函数(或称方法)。如果成员变量是私有的,外界则无法直接访问,而只能求助于该类的方法,因此外界与类成员的交流基本上被限制在调用类方法上。实际上,依据C++的编程思维,是应该鼓励这种交流方式的。在设计类的时候,应尽量将属 阅读详情

this指针(一个永远指向调用对象首地址的指针)

为什么要使用this指针

在c++刚开始学习的过程中,通篇都在强调“类是对象的抽象,对象是类的示例”。那么当同一个类内的不同对象调用同一个函数体的时候,函数体将不同对象的数据进行整合计算,得到的值在返回到该对象的过程是如何实现的呢?

在c语言中我们习惯使用一个指向结构体的指针实现,而在c++中,函数体会隐式的调用this指针,将对象的首地址传给函数体而实现的。

this指针的特性

  • this指针的类型是类类型 (*const)。
  • this指针只能指向对象的首地址。
  • this指针并不属于该类,不影响sizeof()的结果。
  • this指针是非静态成员函数的一个隐含指针形参,属于编译器调用,不需要手动添加,当然显式的将this指针直接在成员函数内写出也是可以的
  • 成员函数被调用时fun(int a) 的原型在编译器看来就是 fun(*const this,int a)

  • this指针不可被修改,成员函数参数列表第一个默认为const this

  • this指针的作用域是非静态成员函数内,其他任何函数都无法调用this指针。

this指针的传参方式

-参数个数确定,this指针通过ecx传递给非静态成员函数
调用函数约定_cdecl _cdecl:参数从右向左传递,参数个数固定,由函数本身清理堆栈。

-参数个数不定,例如(fun(…)),this指针在所有参数被压入堆栈之后再入堆栈 。
调用函数约定 _thiscall _thiscall:c参数从右向左传递,参数个数不定,由调用者清理堆栈。

this指针的实际使用

#include<stdio.h>
struct DATA
{
    int year;
    int month;
    int day;
};
void is_leapyear(struct DATA *P)
{
    if((p.year%400!=0&&p.year%4==0)||(p.year%400==0))
    {
    printf("%d is a leapyear\n",p.year);
    }
    else 
    printf("is not a leapyear\n",p.year);
}
int main()
{
    struct DATA a={2002,2,28};
    struct DATA b={2010,4,10};
    is_leapyear(a);
    is_leapyear(b);
return 0;
}

这是c在使用结构体时,通过调用*p(一个指向结构体的指针)进行调用,实现同一个结构体的不同对象在调用同一个函数的时候实现不同操作。
那么在c++中是如何实现的呢?

class Date{
    int year;
    int month;
    int date;
public Date(int year,int month,int day
{
    this.month =month;   //*显式调用this指针*
    this.year =year;
    this.day =day;  
}
public void setdate(int year,int month,int day){
    this.day =day;
    this.month =month;
    this.year =year;

}
public bool Leapyear()
{
if((year%4==0)&&(year%100!=0)||(year%400==0))
    printf("is leapyear");
else
    printf("is not leapyear");
}
int main()
{
    cout << ( Date( y, m, d ).isLeap() ? "是闰年" : "不是闰年" );
    b.data={2002.2.28};
    b.data.isleapyear();
    return 0;
}

有关this指针比较容易混淆的问题

1.this指针是什么时候创建的?
this在成员函数开始执行前构造,在成员的执行结束后清楚,但是如果class或者struct里面没有方法的话,它们是没有构造函数的,只能当做C的struct使用。采用 TYPE xx的方式定义的话,在栈里分配内存,这时候this指针的值就是这块内存的地址。采用new的方式 创建对象的话,在堆里分配内存,new操作符通过eax返回分配 的地址,然后设置给指针变量。之后去调 用构造函数(如果有构造函数的话),这时将这个内存块的地址传给ecx,之后构造函数里面怎么处理请 看上面的回答。
2.this指针存放在何处?堆、栈、全局变量、还是其他?
this指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全局变量。在汇编级 别里面,一个值只会以3种形式出现:立即数、寄存器值和内存变量值。不是存放在寄存器就是存放在内 存中,它们并不是和高级语言变量对应的。
3我们只有获得一个对象后,才能通过对象使用this指针。如果我们知道一个对象的this指针的位置,可以直接使用吗?
this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以通过&this获得),也可以直接使用它。

C++ this指针深度解析:从原理到实战应用 在C++面向对象编程中,成员函数通过隐式参数机制访问对象数据,这一机制的核心是this指针。从编译器视角看,每个非静态成员函数都隐含一个指向当前对象的this指针参数,它决定了函数如何操作对象实例数据。理解this指针的类型转换(如在const成员函数中变为const指针)是实现逻辑常量性和函数重载的基础。这一原理的技术价值在于支持链式调用、实现拷贝赋值运算符、构建流畅接口等高级编程模式。在实际工程中,this指针广泛应用于解决命名冲突、实现多态回调、构建复杂对象关系等场景。特别是在现代C++开发中,正确使 阅读详情

相关推荐

有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(中)

有限时间滑模控制(FTSMC)和固定时间滑模控制(FixTSMC)是两种重要的控制策略,旨在实现系统状态的快速收敛。FTSMC通过设计滑模面和控制律,确保系统状态在有限时间内收敛到原点,但其收敛时间与初始状态相关。FixTSMC则进一步优化,使收敛时间与初始状态无关,适用于高动态环境,具有更强的鲁棒性和更平滑的控制信号。两种方法均通过李雅普诺夫函数证明其稳定性,并通过仿真验证其有效性。FixTSMC在工程应用中更为可靠,尤其适合安全关键系统。

Lyajpunov的博客 3224

C++中常对象与常成员函数以及this与成员函数的联系与区别

class A { }; /*小记:对于const声明的对象,针对哪个变哪个不变得问题,实际上就是const后的整体不变 e.g.: const int *A; 或 int const *A; //const修饰指向的对象,A可变,A指向的对象不可变 int *const A;   //const修饰指针A, A不可变,A指向的对象可变 const in

MLee的博客 1406

Frida实战:SSL Pinning绕过技术全解析

本文详细解析了如何使用Frida工具绕过SSL Pinning技术,包括环境搭建、四种实战绕过方案及常见问题排查指南。通过具体代码示例和实战经验,帮助安全研究人员快速掌握SSL Pinning绕过技术,适用于金融类App的安全测试场景。

weixin_42530732的博客 188

C++中this指针使用

this指针的使用: this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。 注意: 1.this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。 2.this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。 3.只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用 this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 t

星星之火 可以燎原 2119

GD32F4 Freertos实战:YT8512以太网PHY驱动移植与RMII模式配置详解

本文详细讲解了在GD32F470微控制器上,基于FreeRTOS系统移植YT8512以太网PHY驱动的实战过程。文章重点剖析了RMII时钟模式的选择与配置、PHY地址的正确设置,并针对YT8512芯片的寄存器差异,提供了核心驱动代码的适配方法与调试技巧,帮助开发者顺利完成从官方例程到特定硬件的驱动移植。

weixin_29162439的博客 608

暑期实习前端面试笔试总结汇总

腾讯2020暑期实习——前端视频面试(1)回顾 腾讯2020暑期实习——前端视频面试(2)回顾 腾讯2020暑期实习——前端视频面试(3)回顾 腾讯2020暑期实习——前端视频面试(4)回顾 蘑菇街2020暑期实习——前端视频面试回顾 二、笔试 奇安信前端实习笔试总结 vivo笔试(2020年3月8日) ...

明媚 3065

C++杂讲 this指针

目录 知识点1【成员数据和成员函数的存储方式】 1、成员函数不占类的空间 2、静态成员数据不占类的空间 知识点2 【this指针的引入】 知识点3【this指针概述】 知识点4【this指针的使用】 1、当形参和成员变量同名时,可用this指针来区分 2、在类的普通成员函数中返回对象本身(*this)(重要) 3、如果成员数据和函数的形参 同名 必须使用this指针 4、this指针完成链式操作 c++的封装性:将数据 和 方法 封装在一起 数据 和 方法 是分开存储。 每个.

万里晴空 1266

Pwntools不只是PWN:用它写个自动化Fuzz脚本,挖掘Linux命令行工具漏洞

本文探讨了如何利用Pwntools构建自动化Fuzz脚本,挖掘Linux命令行工具中的漏洞。通过详细的代码示例和实战案例,展示了Pwntools在Fuzzing中的高效性和灵活性,特别适合快速验证特定场景的安全问题。文章还提供了进阶技巧和避坑指南,帮助安全研究人员快速上手并提升测试效率。

weixin_28718345的博客 221

【C++学习笔记(十三)】之this指针的初解读与使用

一. 问题        非内联成员函数只会产生一份函数实例,也就是说多个类对象公用一份函数代码,那么这块函数代码如何区分到底是哪个类对象调用的自己呢?        用this指针来区分类对象。 二. this指针介绍 (一)定义        this指针,指向被调用的成员函数所属的对象。        啥意思呢? (二)

开发小鸽 334

ENVI5.6 批量处理GF-2/GF-6/GF-7:从安装到融合的完整自动化流程

本文详细介绍了ENVI5.6环境下批量处理GF-2/GF-6/GF-7卫星数据的完整自动化流程,包括环境配置、工具安装、正射校正、图像融合等关键步骤。通过实战案例和优化技巧,帮助用户高效完成高分卫星影像处理,提升工作效率。特别针对GF-6和GF-7的特殊处理要点进行了深入解析。

weixin_42546392的博客 179

SAP FI实战入门:从借贷法则到F-02记账,新手必懂的会计凭证操作

本文详细介绍了SAP FI模块中借贷记账法的核心逻辑及F-02凭证录入的全流程操作。通过实例解析借贷方向规则、科目编码设置及金额镜像原则,帮助新手快速掌握会计凭证操作技巧。同时提供了FS10N余额查询和常见错误排查方法,助力用户高效完成SAP财务记账任务。

weixin_29306571的博客 262

C++中的this

1、父类中的this不一定是指向父类对象,也可能指向的是子类对象。 2、当父类初始化自己的对象时,其中的this是指父类对象本身。 3、当子类继承父类时,子类初始化自己的对象,会调用父类的构造函数,此时父类构造函数的this指的是子类对象,而不是父类对象。下面的代码可以说明一切。#include <iostream>class AA { public: int a ; stati

KingW 925

osg点云加载与渲染

osg点云加载与渲染

cangqiongxiaoye的博客 821

c++中this指针的用法详解

为什么引入this指针?     最简单的应用场景就是:当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,这个时候我们该怎么办呢?这个时候就是this指针大显身手的时候了。为此我们引入this指针的概念。 1. this指针的用处:   一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this...

程小二的博客 3万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c++之this指针详解

1.this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。...

学之知之的博客 2012

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++中this指针的用法详解

1. this指针的用处:   一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。  例如,...

weixin_40798471的博客 3701

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C++】自引用this指针的秘密

关于this指针的一个经典回答 当我们在进入一个房子之后,可以看见房子里的桌子、椅子、地板等,但是看不到房子的全貌。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向这个个实例。 识别一个类可以分为哪三步? ①识别类名。 ②识别数据成员。 ③识别成员函数并修改之。 this指针的特性: ①this指针的类型:类类型 * const。 ②thi...

码农印象 1840

C++类与对象(类的引入,this指针)

面向过程与面向对象 面向过程 C语言是面向过程的,关注的是过程,就好比在外卖系统中,关注的是下单,接单,送餐这三个过程,每一个过程都是靠函数来实现的。 面向对象 类似于java,就是纯面向过程的语言,它关注的是商家,用户,骑手这三方以及他们的交互。是靠类的设计与类之间的关系实现的。 而我们的C++是既可以面向对象也可以面向过程的(兼容C) 面向对象的三大特性 封装,继承和多态。 类的引入 关键字 定义类可以使用两种关键字:struct和class。 两者定义类的区别在于,在不使用访问限定符的情况下,stru

分享学习的知识,记录我的技术成长道路 1166

【C++中的this指针详解(小白也能懂)】

文章摘要: 本文用通俗易懂的方式讲解C++中的this指针,帮助初学者理解其作用和用法。this指针是类的非静态成员函数中隐式存在的指针,指向当前对象,用于区分成员变量与局部变量,支持链式调用(如obj.setX().setY())。文章包含简单代码示例演示this的实用场景,并对比Python的self,分析其与静态成员、指针的区别。同时提供了注意事项(如const函数限制、空指针风险)和实际应用场景(构建器模式、操作符重载等)。最后强调this是提升代码清晰度的实用工具,适合C++11及以上标准。

深耕CV 1370

C++ class 中隐含的this指针

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子:       void Date::setMonth( int mn )       {        month = mn; // 这三句是等价的        this->month = mn;        (*this).month = mn;       }     1. this只能在成员函

3600

【C/C++】this指针

this指针

wupenm的专栏 1022

C++类和对象(上):封装、实例化与 this 指针

class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前面或者后面加_ 或者m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。

wbs_scy的博客 1356

C++中this指针的用法.

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this-&gt;month = mn; (*this).month = mn; } 1. this只能在成员函数中使用。 全局函数,静态函数都不能使用this。 实际上,成员函数默认第一个参数为T* c...

sym19862006的专栏 1074

c++中关于this指针

为什么引入this指针? 最简单的应用场景就是:当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,这个时候我们该怎么办呢?这个时候就是this指针大显身手的时候了。为此我们引入this指针的概念。 1. this指针的用处:   一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数..

nb1232的博客 506

【C++】类和对象·this指针

C++this指针一点通!

m0_74452600的博客 964
上一篇: 学习c的第一天
下一篇: ACM1008玛雅历 剖析
errors5835
博客等级 码龄10年 2粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值