之前对this指针误解挺多的,在这里单独写一篇进行总结,有不对之处,欢迎指正批评!html
1.一个类中的不一样对象在调用本身的成员函数时,其实它们调用的是同一段函数代码,那么成员函数如何知道要访问哪一个对象的数据成员呢?ios
没错,就是经过this指针。每一个对象都拥有一个this指针,this指针记录对象的内存地址,当咱们调用成员函数时,成员函数默认第一个参数为T* const register this,大多数编译器经过ecx寄存器传递this指针,经过 this 这个隐式参数能够访问该对象的数据成员。程序员
2.类的成员函数为何不能用static和const同时修饰?函数
类中用const修饰的函数一般用来防止修改对象的数据成员,函数末尾的const是用来修饰this指针,防止在函数内对数据成员进行修改,而静态函数中是没有this指针的,没法访问到对象的数据成员,与C++ static语义冲突,因此不能。大数据
1.C++中this关键字是一个指向对象本身的一个常量指针,不能给this赋值;this
2.只有成员函数才有this指针,友元函数不是类的成员函数,没有this指针;人工智能
3.一样静态函数也是没有this指针的,静态函数如同静态变量同样,不属于具体的哪个对象;spa
4.this指针做用域在类成员函数内部,在类外也没法获取;指针
5.this指针并非对象的一部分,this指针所占的内存大小是不会反应在sizeof操做符上的。code
1.在类的非静态成员函数中返回类对象自己的时候,直接使用 return *this,好比类的默认取址运算符重载函数,另外,也能够返回*this的引用,这样能够像输入输出流那样进行“级联”操做;
2.修改类成员变量或参数与成员变量名相同时,如this->a = a (写成a = a编译不过);
3.在class定义时要用到类型变量自身时,由于这时候还不知道变量名,就用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指针的。能够这样理解,你给函数传递了错误的参数,但在该函数内部并无使用该参数,因此其不影响函数的运行。能够参考下面代码:
1 #include <iostream> 2 using namespace std; 3 4 class CPeople 5 { 6 public: 7 CPeople(const std::string& name, int age) 8 : mName(name), mAge(age){} 9 ~CPeople(); 10 11 void Print() 12 { 13 std::cout << "show people info:" << std::endl; 14 } 15 16 void PrintInfo() 17 { 18 std::cout << "name:" << mName << std::endl; 19 std::cout << "age:" << mAge << std::endl; 20 } 21 22 private: 23 24 std::string mName; 25 int mAge; 26 27 }; 28 29 int main() 30 { 31 CPeople* jon = NULL; 32 jon->Print(); // 程序正常运行 33 jon->PrintInfo(); // 程序崩溃,访问非法地址,此时mName和mAge并无分配空间 34 return 0; 35 }
引用网上关于this指针的一个经典回答:
对this指针有了一个全面了解后,是否对C++ class理解也更深入一步?
写做,能让人更深刻的了解事情的本质,慢慢积累,厚积薄发,加油!
做者:KeepHopes
出处:http://www.javashuo.com/article/p-rtkesrte-be.html
关于做者:专一C++,对大数据、人工智能领域颇感兴趣,请多多赐教!
本文为做者原创,版权归做者和博客园共有,转载或引用请注明出处,谢谢!