this指针指向什么,这里的this指向谁

1,这里的this指向谁因为B在方法C内,而C是根据 document.getElementById("aa").onclick=c()就是说在跳进方法之前当前对象是根据id = “aa”选择得到的超链接标签
2,this指针是什么意思是指向当前对象的指针,它只是被固定下来的(被C++开发商定义成那样的,这个指针经常用到,所以就直接固定死它,它是一个默认影藏起来的指针)用来指向你正在编辑的 类 将产生的对象;还不明白的话:#include"iostream.h"class A{private: int x;public: A(int x);};A::A(int x){ this->x=x; cout<<x;}void main(){ A a(5);}这里就要用 this-> 指明前面的X是对象的变量,后面的X是函数通过参数传过来的X  , 不然的话 编译器 不知道两个X到底是哪一个 , 所以用this->指向当前对象(类的对象)X 假如 A(int x)这里面的X用 Y来代替的话 ,“this->”这东西就可以不用写了,应为 X , Y不同名字,编译器分的清楚 。这样讲不知道清楚否 。。。【this指针指向什么,这里的this指向谁】
3,this指针指的是什么this指针是一个隐含于每一个成员函数中的特殊指针 。它是一个指向正在被该成员函数操作的对象,也就是要操作该成员函数的对象 。当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含作用this指针 。而通常不去显式地使用this指针来引用数据成员 。同样也可以使用*this来标识调用该成员函数的对象 。下面举一例子说明this指针的应用 。#include<iostream.h>classApublic:A()A(inta,intb)voidcopy(A&aa);//对象引用作函数参数voidprint()private:inta,b;};voidA::copy(A&aa)if(this==&aa)return;//这个this是操作该成员函数的对象的地址 , 在这里是对象a1的地址*this=aa;//*this是操作该成员函数的对象,在这里是对象a1 。//此语句是对象aa赋给a1,也就是aa具有的数据成员的值赋给a1的数据成员}voidmain()Aa1,a2(3,4);a1.copy(a2);a1.print();}运行结果:3,4
4 , Cthis指针的详细解析在前面曾经提到过: 每个对象中的数据成员都分别占有存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间以存放n个对象中的数据成员 。但是 , 不同对象都调用同一个函数代码段 。那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所指定的对象的数据成员呢?假如,对于例9.6程序中定义的Box类,定义了3个同类对象a,b,c 。如果有a.volume( ) ,应该是引用对象a中的height,width和length,计算出长方体a的体积 。如果有b.volume( )  , 应该是引用对象b中的height,width和length,计算出长方体b的体积 。而现今都用同一个函数段,系统怎样使它分别引用a或b中的数据成员呢?在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this指针 。它是指向本类对象的指针 , 它的值是当前被调用的成员函数所在的对象的起始地址 。例如,当调用成员函数a.volume时,编译系统就把对象a的起始地址赋给this指针,于是在成员函数引用数据成员时 , 就按照this的指向找到对象a的数据成员 。例如volume函数要计算height*width*length的值,实际上是执行:(this->height)*(this->width)*(this->length)由于当前this指向a,因此相当于执行:(a.height)*(a.width)*( a.length)这就计算出长方体a的体积 。同样如果有b.volume( ),编译系统就把对象b的起始地址赋给成员函数volume的this指针,显然计算出来的是长方体b的体积 。this指针是隐式使用的 , 它是作为参数被传递给成员函数的 。本来,成员函数volume的定义如下:int Box::volume( )return (height*width*length);}C++把它处理为int Box::volume(Box *this)return (this->height * this->width * this->length);}即在成员函数的形参表列中增加一个this指针 。在调用该成员函数时,实际上是用以下方式调用的:a.volume(&a);将对象a的地址传给形参this指针 。然后按this的指向去引用其他成员 。需要说明: 这些都是编译系统自动实现的,编程序者不必人为地在形参中增加this指针,也不必将对象a的地址传给this指针 。在需要时也可以显式地使用this指针 。例如在Box类的volume函数中,下面两种表示方法都是合法的、相互等价的 。return (height * width * length); //隐含使用this指针return (this->height * this->width * this->length); //显式使用this指针可以用*this表示被调用的成员函数所在的对象,*this就是this所指向的对象,即当前的对象 。例如在成员函数a.volume( )的函数体中,如果出现*this,它就是本对象a 。上面的return语句也可写成return((*this).height * (*this).width * (*this).length);注意*this两侧的括号不能省略,不能写成*this.height 。所谓“调用对象a的成员函数f”,实际上是在调用成员函数f时使this指针指向对象a,从而访问对象a的成员 。在使用“调用对象a的成员函数f”时 , 应当对它的含义有正确的理解 。5,C中的this指针是什么意思1. this指针的用处:一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果 。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数 。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行 。例如 , 调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .2. this指针的使用:一种情况就是,在类的非静态成员函数中返回类对象本身的时候 , 直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n) 。3. this指针程序示例:this指针存在于类的成员函数中,指向被调用函数所在的类实例的地址 。根据以下程序来说明this指针#includeclass Pointpublic:Point(int a, int b) void MovePoint( int a, int b)void print()};void main( )Point point1( 10,10);point1.MovePoint(2,2);point1.print( );}当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针 。MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的 。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:void MovePoint(int a, int b) 4. 关于this指针的一个经典回答:当你进入一个房子后 , 你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了 。对于一个类的实例来说 , 你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身5. 类的this指针有以下特点:(1)this只能在成员函数中使用 。全局函数、静态函数都不能使用this.实际上,成员函数默认第一个参数为T * const this 。如: class Apublic:int func(int p)} };其中,func的原型在编译器看来应该是:int func(A * const this,int p);(2)由此可见 , this在成员函数的开始前构造,在成员函数的结束后清除 。这个生命周期同任何一个函数的参数是一样的,没有任何区别 。当调用一个类的成员函数时 , 编译器将类的指针作为函数的this参数传递进去 。如:A a;a.func(10);此处,编译器将会编译成:A::func(&a,10);看起来和静态函数没差别,对吗?不过,区别还是有的 。编译器通常会对this指针做一些优化,因此,this指针的传递效率比较高--如VC通常是通过ecx寄存器传递this参数的 。(3)几个this指针的易混问题 。A. this指针是什么时候创建的?this在成员函数的开始执行前构造,在成员的执行结束后清除 。但是如果class或者struct里面没有方法的话,它们是没有构造函数的,只能当做C的struct使用 。采用 TYPE xx的方式定义的话,在栈里分配内存,这时候this指针的值就是这块内存的地址 。采用new的方式 创建对象的话,在堆里分配内存 , new操作符通过eax返回分配 的地址,然后设置给指针变量 。之后去调 用构造函数(如果有构造函数的话),这时将这个内存块的地址传给ecx,之后构造函数里面怎么处理请 看上面的回答 。B. this指针存放在何处?堆、栈、全局变量,还是其他?this指针会因编译器不同而有不同的放置位置 。可能是栈,也可能是寄存器,甚至全局变量 。在汇编级 别里面,一个值只会以3种形式出现:立即数、寄存器值和内存变量值 。不是存放在寄存器就是存放在内 存中,它们并不是和高级语言变量对应的 。C. this指针是如何传递类中的函数的?绑定?还是在函数参数的首参数就是this指针?那么 , this指针 又是如何找到“类实例后函数的”?大多数编译器通过ecx寄存器传递this指针 。事实上,这也是一个潜规则 。一般来说 , 不同编译器都会遵从一致的传参规则,否则不同编译器产生的obj就无法匹配了 。在call之前 , 编译器会把对应的对象地址放到eax中 。this是通过函数参数的首参来传递的 。this指针在调用之前生成,至于“类实例后函数”,没有这个说法 。类在实例化时 , 只分配类中的变量空间,并没有为函数分配空间 。自从类的函数定义完成后 , 它就在那儿,不会跑的 。D. this指针是如何访问类中的变量的?如果不是类,而是结构体的话,那么,如何通过结构指针来访问结构中的变量呢?如果你明白这一点的话,就很容易理解这个问题了 。在C++中 ,类和结构是只有一个区别的:类的成员默认是private , 而结构是public 。this是类的指针,如果换成结构,那this就是结构的指针了 。E. 我们只有获得一个对象后,才能通过对象使用this指针 。如果我们知道一个对象this指针的位置,可以直接使用吗?this指针只有在成员函数中才有定义 。因此,你获得一个对象后,也不能通过对象使用this指针 。所以 , 我们无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置) 。当然,在成员函数里 , 你是可以知道this指针的位置的(可以通过&this获得),也可以直接使用它 。F. 每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?普通的类函数(不论是成员函数,还是静态函数)都不会创建一个函数表来保存函数指针 。只有虚函数才会被放到函数表中 。但是,即使是虚函数,如果编译器能明确知道调用的是哪个函数 , 编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数 。A.静态成员函数没有this指针B 。由友元函数本质上不属于这个类,所以也没有 。C 。明显错D 。对的 。A.fun1.就是上面选择题的知识点this指针是指一个类 , 在实例化时,也就是生成对象时 。其实可以生成很多对象,怎么区别是哪个对象要调用共同的成员函数呢 。本对象在调用成员函数,如何让编译器识别出,所以就有必要用一个指针来指向这个对象 。就是指向自己,所以有了this指针 。静态成员函数 , 是被这个类所有的对象共有的,所有不需要this来区别调用,直接调用就是 。友元函数本质上是不是这个类里的函数 , 只是有特权的访问而已,不是这个类的东西,没必要给this指针 。B1.D2.B首先,理解一下这句话“this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址 。全局仅有一个this指针,当一个对象被创建时,this指针就指向对象数据的首地址 。”;其中有几个关键词,“自动生成”,“自动隐藏” , “存在于类的非静态成员函数中”,“调用函数所在的对象”,重点理解这几个词 。当你创建一个类对象时 , 就已经隐含生成了一个this指针,它时刻指向你这个实例对象本身 。这里有一个很形象的比喻:当你进入一个房子后 ,  你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了 。对于一个类的实例来说, 你可以看到它的成员函数、成员变量 ,  但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本

    推荐阅读