C++中this指针的理解与作用详解
01C++程序到C程序的翻译
要想理解C++的this指针,我们先把下面的C++代码转换成C的代码
classCar { public: intm_price;//成员变量 voidSetPrice(intp)//成员函数 { m_price=p; } }; intmain() { Carcar; car.SetPrice(20000);//给car对象m_price成员变量赋值 return0; }
C语言是没有类定义的class关键词,但是有跟class类似的定义,那就是结构体struct。
m_price变量是Car类的成员变量,那么我们可以把Car类和成员变量翻译成如下的C代码:
//结构体Car structCar { //price变量是属于Car结构体这个域里的变量 intprice; };
SetPrice函数是Car类的成员函数,但是C程序里是没有成员函数这种概念的,所以只能把成员函数翻译成全局的函数:
//参数1:结构体Car的指针 //参数2:要设置的价格变量 voidSetPrice(structCar*this,intp) { this->price=p;//将传入的Car结构体的price变量赋值 }
为什么要加个this的指针呢?我们继续往下看。
在这里我们把上面main函数下面的C++程序翻译C程序是这样的:
intmain() { structCarcar; SetPrice(&car,20000); return0; }
所以最终把上述的C++程序转换成C程序的代码如下:
structCar { intprice; }; voidSetPrice(structCar*this,intp) { this->price=p; } intmain() { structCarcar; SetPrice(&car,20000);//给car结构体的price变量赋值 return0; }
02this指针的作用
其作用就是指向成员函数所作用的对象,
所以非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针。
#includeclassCar { public: intm_price; voidPrintPrice() { std::cout< m_price=p;//等价于m_price=p; this->PrintPrice();//等价于PrintPrice(); } CarGetCar() { return*this;//返回该函数作用的对象 } }; intmain(void) { Carcar1,car2; car1.SetPrice(20000); //GetCar()成员函数返回所作用的car1对象,所把返回的car1赋值给了car2 car2=car1.GetCar(); car2.PrintPrice(); return0; }
输出结果:
20000
20000
接下来我们下面的代码,你觉得输出结果是什么呢?会出错吗?
classA { inti; public: voidHello(){cout<<"hello"<Hello();//结果会怎样? }
答案是正常输出hello,你可能会好奇明明p指针是空的,不应该是会程序奔溃吗?别着急,我们先把上面的代码转换C程序,就能理解为什么能正常运行了。
voidHello(){cout<<"hello"<Hello(); #执行Hello()形式相当于: Hello(p);
所以,实际上每个成员函数的第一个参数默认都有个指向对象的this指针,上述情况下如果该指向的对象是空,相当于成员函数的第一个参数是NULL,那么只要成员函数没有使用到成员变量,也是可以正常执行。
下面这份代码执行时,就会奔溃了,因为this指针是空的,使用了空的指针指向了成员变量i,程序就会奔溃。
classA { inti; public: voidHello(){cout<>voidHello(A*this){cout<i<<"hello"< Hello();//->>Hello(p); }
03this指针和静态成员函数
静态成员函数是不能使用this指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。
04小结
通过将C++程序翻译成C程序的方式,来理解this指针,其作用就是指向非静态成员函数所作用的对象,每个成员函数的第一个参数实际上都是有个默认this指针参数。
静态成员函数是无法使用this指针,
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。