热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

this指针[ZT]

先说明何谓this指针:classCA{longa;voidA(longe);voidB(longe);};上面的类定义实际上如下:structs_CA
先说明何谓this指针:  
class CA  
{  
  long a;  
  void A(long e);  
  void B(long e);  
};  
上面的类定义实际上如下:  
struct s_CA  
{  
  long a;  
};  
void CA_A(s_CA *this, long e);  
void CA_B(s_CA *this, long e);  
   
因此:  
CA a;         // 此时实际为:s_CA a; CA_CA(&a);     //   调用构造函数  
a.A(34);     // 此时实际如下:CA_A(&a, 34);  
   
因此所谓的this指针就是struct s_CA的一个指针,而所谓的类实例其实就是一个结构的实例。而当出现虚函数时,假设如下:  
接口IA为:                                                         接口IB为:  
struct IA                                                           struct IB  
{                                                                      {  
  void A(long e) = 0;                                       void B(long e) = 0;  
};                                                                     };  
而CA派生自IA和IB,即实现IA和IB(用ATL的方式),此时s_CA变成如下: 
struct   s_CA  
{  
  void *pvt_A;     // 由于IA所引入的虚函数地址指针,也就是所谓的一份函数拷贝  
  void *pvt_B;     // 由于IB所引入的虚函数地址指针,也就是所谓的一份函数拷贝  
  long a;  
};  
   
此时:  
CA a;  
IA *pA = static_cast(&a);     // 此时pA == &a  
IB *pB = static_cast(&a);     // 此时pB == &a + 4,跳过pvt_A,由static_cast这个指令进行转换的  
pA->A(34);     // 此时实际为(*pA->pvt_A[0])(pA, 34);  
pB->B(34);     // 此时实际为(*pB->pvt_B[0])(pB, 34);  
而pA->pvt_A[0]的函数原型为void CA_A(IA *this, long e);  
而pB->pvt_B[0]的函数原形为void CA_B(IB *this, long e);  
   
因此就有函数CA_A和CA_B,而CA_A的this指针是IA*,CA_B的this指针是IB*,即调用接口函数时传递的this指针就是那个接口的指针,但是数据是怎么传递的呢?即编译器如何知道IA*加上8个字节后就是成员变量a的值?  
   
很简单,因为CA_A和CA_B是类CA实现的,因此编译器在编译CA_A时知道此时传进来的this+8就是成员变量a的地址,在CA_B时知道此时传进来的this+4就是成员变量a的地址,因为编译器在编译这两个函数时是知道类CA的定义的,即编译器知道如下: 
class CA : public IA, public IB  
{  
  long a;  
  void A(long e); 
  void B(long e);  
};  
所以编译器知道传进来的this到底是个什么类的实例,因而可以表现出通过传递虚函数列表的指针就达到了传递数据成员的现象。

转:https://www.cnblogs.com/mixiyou/archive/2009/08/16/1547342.html



推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • SAP羞辱国产软件商:技术停在10年前
    SAP中国研究院总裁芮祥麟表示,国产软件厂商过于热衷概念炒作,技术水平停留在10年前的客户端架构水平。他认为,国内厂商推出基于SOA的产品或转型SAAS模式是不可能的,研发新架构需要时间。当前最热门的概念是云计算,芮祥麟呼吁国产厂商应该潜心研发底层架构。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文讲述了孙悟空写给白骨精的信件引发的思考和反省。孙悟空在信中对自己的行为进行了反思,认识到自己胡闹的行为并没有给他带来实际的收获。他也揭示了西天取经的真相,认为这是玉皇、菩萨设下的一场陷阱。他还提到了师傅的虚伪和对自己的实心话,以及自己作为师傅准备提拔的对象而被派下来锻炼的经历。他认为路上的九九八十一难也都是菩萨算计好的,唐僧并没有真正的危险。最后,他提到了观音菩萨在关键时刻的指导。这封信件引发了孙悟空对自己行为的思考和反省,对西天取经的目的和自己的角色有了更深入的认识。 ... [详细]
  • Windows2003 IIS上设置301定向,实现不带www域名跳转带www域名的方法
    打开IIS,建一个网站,主机头用不带www的域名,随便指向一个目录。然后在这个网站上点右键,属性--主目录--重定向到URL如图ÿ ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • 本文详细介绍了使用 SQL Load 和 Excel 的 Concatenate 功能将数据导入 ORACLE 数据库的方法和步骤,同时介绍了使用 PL/SQL tools 将数据导入临时表的方法。此外,还提供了一个转链接,可参考更多相关内容。摘要共计XXX字。 ... [详细]
author-avatar
重庆车管所
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有