C++中this指针有什么作用
创始人
2024-12-24 08:21:48
0次

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 class Car {public: int m_price;  void PrintPrice() {  std::cout << m_price << std::endl;  }  void SetPrice(int p) {  this->m_price = p; // 等价于 m_price = p;  this->PrintPrice();// 等价于 PrintPrice(); }  Car GetCar() {  return *this; // 返回该函数作用的对象 }};int main(void){ Car car1, car2; car1.SetPrice(20000);  // GetCar()成员函数返回所作用的car1对象,所把返回的car1赋值给了car2 car2 = car1.GetCar();  car2.PrintPrice();   return 0;}

输出结果:

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 指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...