C/C++培训
达内IT学院
400-996-5531
1、一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码,那么成员函数如何知道要访问哪个对象的数据成员呢?
没错,就是通过this指针。每个对象都拥有一个this指针,this指针记录对象的内存地址,当我们调用成员函数时,成员函数默认第一个参数为T* const register this,大多数编译器通过ecx寄存器传递this指针,通过 this 这个隐式参数可以访问该对象的数据成员。
2、类的成员函数为什么不能用static和const同时修饰?
类中用const修饰的函数通常用来防止修改对象的数据成员,函数末尾的const是用来修饰this指针,防止在函数内对数据成员进行修改,而静态函数中是没有this指针的,无法访问到对象的数据成员,与C++ static语义冲突,所以不能。
this指针注意点:
1、C++中this关键字是一个指向对象自己的一个常量指针,不能给this赋值;
2、只有成员函数才有this指针,友元函数不是类的成员函数,没有this指针;
3、同样静态函数也是没有this指针的,静态函数如同静态变量一样,不属于具体的哪一个对象;
4、this指针作用域在类成员函数内部,在类外也无法获取;
5、this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。
this指针的使用:
1、在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this,比如类的默认取址运算符重载函数,另外,也可以返回*this的引用,这样可以像输入输出流那样进行“级联”操作;
2、修改类成员变量或参数与成员变量名相同时,如this->a = a (写成a = a编译不过);
3、在class定义时要用到类型变量自身时,因为这时候还不知道变量名,就用this这样的指针来使用变量自身。
this指针探讨:
1、this指针是什么时候创建的?
对象new的过程中创建的,具体哪个阶段有待进一步深入了解。
2、this指针存放在何处?
this指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全局变量。在汇编级别里面,一个值只会以3种形式出现:立即数、寄存器值和内存变量值。不是存放在寄存器就是存放在内存中,它们并不是和高级语言变量对应的。
3、为什么C++ NULL对象指针可以调用非虚成员函数,而Java中却不行?
C++语言是静态绑定的,这也是C++语言和Java语言的一个显著区别。类的成员函数并不与特定对象绑定,所有成员函数共用一份成员函数体,当程序编译后,成员函数的地址即已经确定。另外,C++只关心你的指针类型,不关心指针指向的对象是否有效,C++要求程序员自己保证指针的有效性。况且在有些系统上,地址0也是有效的,理论上完全可以构造一个在地址0上的对象,所以C++中nullptr对象调用成员函数并无不可 。
nullptr对象调用成员函数时,只要不访问此对象独有的内存部分,则程序正常运行,因为不会使用this,一旦访问此对象的成员变量,则程序崩溃。当然nullptr调用虚方法是不能正常运行的(虚函数有虚表,会占用内存空间),虚方法调用是依赖于this指针的。可以这样理解,你给函数传递了错误的参数,但在该函数内部并没有使用该参数,所以其不影响函数的运行。
总结:
引用网上关于this指针的一个经典回答:当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。对this指针有了一个全面了解后,是否对C++ class理解也更深刻一步?写作,能让人更深入的了解事情的本质,慢慢积累,厚积薄发,加油!
版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved