zoukankan      html  css  js  c++  java
  • this指针

    this指针易混的几个问题:

    (1)This指针本质是一个函数参数,只是编译器隐藏起形式的,语法层面上的参数。
         this指针只能在成员函数中使用,全局函数、静态函数都不能使用this指针
         实际上,成员函数默认的第一个参数为T* const this
    (2) this在成员函数的开始前构造,在成员的结束后消除。这个生命周期同任何函数的参数是一样的,没有任何区别。当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。
         看起来   this指针和静态函数没差别,不过,区别还是有的。编译器通常会对this指针做一些优化,因此,this指针的传递效率比较高。
    (3)this指针并不占用对象的空间
         this相当于费静态成员函数的一个隐含的参数,不占用对象的空间。它跟对象之间没有包含关系,只是当前调用函数的对象被它指向自己。
         所有成员函数的参数,不管是不是隐含的,都不会占用对象的空间,只会占用参数传递时的栈空间,或者直接占用一个寄存器。
    (4)this指针是什么时候创建的?
         this指针在成员函数的开始执行前构造,在成员的执行结束后消除。
         但是如果class或者struct里面没有方法的话,它们是没有构造函数的,只是当做C的struct使用。采用TYPE xx的方式定义的话,在栈里分配内存,这时候this指针的值就是这块内存的地址。采用new方式创建对象的话,在栈里分配内存,new操作符通过eax返回分配的地址,然后设置给指针变量。之后去调用构造函数(如果有构造函数的话),这时将这块内存块的地址传给eax.
    (5)this指针是如何传递给类中的函数的?绑定?还是在函数参数的首参数就是this指针?那么,this指针又是如何找到“类实例后函数”的?
         大多数编译器通过eax寄存器传递this指针。事实上,这也是一个潜规则。一般来说,不同的编译器都会遵循一致的传参规则,否则不同的编译器产生的obj就无法匹配了。
    (6)我们只有获得一个对象后,才能通过对象使用this指针。如果我们知道一个对象this指针的位置,可以直接使用吗?
         this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们无法知道一个对象this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以通过&this获得)。
  • 相关阅读:
    ReSharper.8.0.14.856注册码
    asp.net 301重定向代码
    WebResource.axd 404 错误
    【原创】asp.net导出word 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 8000401a
    C#操作word或excel及水晶报表,检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005
    Repository 设计模式介绍
    将15位身份证转换成18位
    清理数据库木马文件
    Oracle的创建表空间及用户
    使用python脚本执行地理处理工具
  • 原文地址:https://www.cnblogs.com/lijia0511/p/4936843.html
Copyright © 2011-2022 走看看