1,求Cthis指针详细解释this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果 。this作用域是在类内部 , 当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数 。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行 。例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .this指针的使用: 一种情况就是,在类的非静态成员函数中返回类对象本身的时候 , 直接使用 return *this;另外一种情况是当参数与成员变量名相同时 , 如this->n = n (不能写成n = n) 。
2,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
3,this指针存在的目的是this指针存在的目的是(B、保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码)一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果 。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数 。扩展资料:一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果 。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数 。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的 , 它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行 。B,this与基类子类的问题没有关系 。只是一个指向自己的指针,访问自己的数据成员 。哎 , 这些东西如果一说就复杂了 。是这样的,其实不管c语言还是c++语言,最后编译成机器码并没有什么本质的区别,所谓类,虽然在语言这个层面有了一个概念性的解释(相同属性相同操作的集合的抽象化) , 但是实际上在二进制的表示和结构上没有什么本质的区别,都是一个内存区域保存了一些值 。那这样一来,就可能使得程序员跨过一个类的限制(比如应该只能访问自己的成员,但是你想办法访问了其他对象的成员) 。所以c++在设计的时候就隐含了一个this指针 , 这个指针主要是用于保证你的访问不能跨界和用于区分不同的对象 。举个例子,你的任何一个函数的申明实际隐含了一个this指针参数,这个参数你不可见,也不可编辑,是编译器自动添加上去的 , 为什么要这样?实际上对象在实例化的时候,体积是非常小的 , 并没有每一个对象都保存函数 , 同一个类的对象的函数实际上只有一份副本(二进制层面) , 那如何来区分到底是谁调用了函数?就是这个this指针 。this指针实际是指向了对象的内存地址起始值 , 所以通过一个偏移量,就知道了对象的各种属性(变量),也就确定了一个绝对的对象 。当然在对象的函数操作里我们可以显示的用this->的方式来引用变量,但是你也发现你即使不加上this指针,它依然知道你引用了谁,其实就是隐含了一个参数this指针 。为了进一步理解,想一下static修饰的函数有什么区别,为什么static函数只能访问static修饰的属性?因为static修饰的函数就没有传递这个this指针,所以它不知道你指的是哪一个对象 。而实际上,static修饰的符号就和c语言的全局变量和函数无区别了 。【this指针有什么作用,求Cthis指针详细解释】
4,谁能详细的解释一下c类中的的this指针的详细内容主要是用this返1、其实在编译器内部,成员函数和非成员函数的调用是一样的 。你定义了一个类的成员函数,编译器会把它变成一个普通函数,为了知道哪一个对象调用了该函数,它会插入一个参数,比如class test……void fun(int i)……};针对fun编译器生成的的全局函数是void fun(test* this,int i)如果有这样的应用test t1;t1.fun(2);//case 1对于case 1编译器生成的代码是fun(&t1,2);2、如果成员函数是const修饰的class test……void fun(int i) const……}; 那么编译器的处理是void fun(const test* this,int i)也就是说 , 你不能改变this指向的对象3、至于static修饰的函数,它不属于任何类 , 因此编译器不会插入this指针 。4、若是要返回对象的引用的话,可以这样class test……test& fun(int i) const……};每一个非静态成员函数里面都有一个隐式的this指针,它指向当前调用函数的对象 。比如stu.Output();this 指向stu的首地址 。问题在这一句*max(array,(sizeof(array)/sizeof(int)))这一句,只要把前面的*号去掉就是指针了,加*号就是对指针取指向的内容,不加星就是指针本身,举个例子吧,int a=10 , int *p=&a, cout<<p<<endl,打印的指针,就是指针存储的内存地址,cout<<*p<<endl,打印的是指针指向的内容,其实就是变量a的值,对于函数也是这样的,你的函数是返回指针,但是你加了*号就是取内容了一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果 。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数 。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行 。this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址 。全局仅有一个this指针,当一个对象被创建时,this指针就指向对象数据的首地址 。5 , cthis指针详解this指针只能在一个类的成员函数中调用,它表示当前对象的地址 。下面是一个例子:void Date::setMonth( int mn )month = mn; // 这三句是等价的this->month = mn;(*this).month = mn;} 1. this只能在成员函数中使用 。全局函数,静态函数都不能使用this 。实际上,成员函数默认第一个参数为T* const register this 。如: class A其中,func的原型在编译器看来应该是: int func(A* const register this, int p); 2. 由此可见,this在成员函数的开始前构造的 , 在成员的结束后清除 。这个生命周期同任一个函数的参数是一样的,没有任何区别 。当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去 。如:A a;a.func(10);此处,编译器将会编译成: A::func(&a, 10);嗯,看起来和静态函数没差别,对吗?不过 , 区别还是有的 。编译器通常会对this指针做一些优化的,因此 , this指针的传递效率比较高--如vc通常是通过ecx寄存器来传递this参数 。3. 回答#1:this指针是什么时候创建的?this在成员函数的开始执行前构造的,在成员的执行结束后清除 。#2:this指针存放在何处? 堆,栈,全局变量,还是其他?this指针会因编译器不同,而放置的位置不同 。可能是栈,也可能是寄存器,甚至全局变量 。#3:this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?this是通过函数参数的首参数来传递的 。this指针是在调用之前生成的 。类实例后的函数 , 没有这个说法 。类在实例化时,只分配类中的变量空间,并没有为函数分配空间 。自从类的函数定义完成后,它就在那儿,不会跑的 。#4:this指针如何访问类中变量的/?如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量呢?如果你明白这一点的话,那就很好理解这个问题了 。在C++中,类和结构是只有一个区别的:类的成员默认是private,而结构是public 。this是类的指针,如果换成结构 , 那this就是结构的指针了 。#5:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的位置可以直接使用吗?this指针只有在成员函数中才有定义 。因此,你获得一个对象后 , 也不能通过对象使用this指针 。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置) 。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的 。#6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?普通的类函数(不论是成员函数 , 还是静态函数) , 都不会创建一个函数表来保存函数指针的 。只有虚函数才会被放到函数表中 。但是 , 既使是虚函数 , 如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数 。# 7:这些编译器如何做到的?8:能否模拟实现?知道原理后,这两个问题就很容易理解了 。其实,模拟实现this的调用,在很多场合下,很多人都做过 。例如,系统回调函数 。系统回调函数有很多,如定时,线程啊什么的 。举一个线程的例子:class Aint n;public:static void run(void* pThis)A* this_ = (A*)pThis;this_->process();}void process()};main()A a;_beginthread( A::run, 0, &a );}这里就是定义一个静态函数来模拟成员函数 。也有许多C语言写的程序,模拟了类的实现 。如freetype库等等 。其实,有用过C语言的人,大多都模拟过 。只是当时没有明确的概念罢了 。如:typedef struct studentint age;int no;int scores;}Student;void initStudent(Student* pstudent);void addScore(Student* pstudent, int score);...如果你把 pstudent改成this,那就一样了 。它相当于:class Studentpublic:int age; int no; int scores;void initStudent();void addScore(int score);}const常量可以有物理存放的空间,因此是可以取地址的///this指针是在创建对象前创建.this指针放在栈上,在编译时刻已经确定.并且当一个对象创建后,并且运行整个程序运行期间只有一个this指针.
推荐阅读
- 360安全网址,360的官方网址是多少
- mysql数据量大查询慢 mysql数据统计很慢怎么办
- 录音机软件,什么录音软件最好
- mysql fk mysql中fk是什么意思
- 重命名文件linux命令 重命名MySQL
- 生物教学质量分析表
- mysql看密码 mysql怎么验证密码
- 负载均衡器,F5的负载均衡器起什么作用
- 有限元分析 matlab