重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章给大家分享的是有关C++中this指针有什么作用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创新互联主营吴川网站建设的网络公司,主营网站建设方案,重庆App定制开发,吴川h5微信小程序搭建,吴川网站营销推广欢迎吴川等地区企业咨询
01 C++ 程序到 C 程序的翻译
要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码
class Car {public: int m_price; // 成员变量 void SetPrice(int p) // 成员函数 { m_price = p; }};int main(){ Car car; car.SetPrice(20000); // 给car对象m_price成员变量赋值 return 0;}
C 语言是没有类定义的class关键词,但是有跟class类似的定义,那就是结构体struct。
m_price变量是Car类的成员变量,那么我们可以把Car类和成员变量翻译成如下的 C 代码:
// 结构体Carstruct Car{ // price变量是属于Car结构体这个域里的变量 int price; };
SetPrice函数是Car类的成员函数,但是 C 程序里是没有成员函数这种概念的,所以只能把成员函数翻译成全局的函数:
// 参数1:结构体Car的指针// 参数2:要设置的价格变量void SetPrice(struct Car* this, int p){ this->price = p; // 将传入的Car结构体的price变量赋值}
为什么要加个 this 的指针呢?我们继续往下看。
在这里我们把上面main函数下面的 C++ 程序翻译 C 程序是这样的:
int main() { struct Car car; SetPrice( &car, 20000); return 0;}
所以最终把上述的 C++程序 转换成C 程序的代码如下:
struct Car{ int price; };void SetPrice(struct Car* this, int p){ this->price = p; }int main() { struct Car car; SetPrice( &car, 20000); // 给car结构体的price变量赋值 return 0;}
02 this指针的作用
其作用就是指向成员函数所作用的对象,
所以非静态成员函数中可以直接使用 this 来代表指向该函数作用的对象的指针。
#include
输出结果:
2000020000
接下来我们下面的代码,你觉得输出结果是什么呢?会出错吗?
class A{ int i; public: void Hello() { cout << "hello" << endl; }};int main(){ A * p = NULL; p->Hello(); //结果会怎样?}
答案是正常输出hello,你可能会好奇明明 p 指针是空的,不应该是会程序奔溃吗?别着急,我们先把上面的代码转换C程序,就能理解为什么能正常运行了。
void Hello() { cout << "hello" << endl; } # 成员函数相当于如下形式:void Hello(A * this ) { cout << "hello" << endl; }p->Hello(); # 执行Hello()形式相当于:Hello(p);
所以,实际上每个成员函数的第一个参数默认都有个指向对象的 this 指针,上述情况下如果该指向的对象是空,相当于成员函数的第一个参数是NULL,那么只要成员函数没有使用到成员变量,也是可以正常执行。
下面这份代码执行时,就会奔溃了,因为this指针是空的,使用了 空的指针指向了成员变量i,程序就会奔溃。
class A{ int i;public: void Hello() { cout << i << "hello" << endl; } // ->> void Hello(A * this ) { cout << this->i << "hello" << endl; }};int main(){ A * p = NULL; p->Hello(); // ->> Hello(p); }
03 this指针和静态成员函数
静态成员函数是不能使用 this 指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。
以上就是C++中this指针有什么作用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。