1.this指针的作用
一个对象可以拥有很多个成员;而在很多个对象中间,我们为了证明某个成员是自己的成员,而不是其他对象的成员,我们同样需要给这些成员取上名字。在C++中,我们利用this指针帮助对象做到这一点,this指针记录每个对象的内存地址,然后通过运算符->访问该对象的成员。
2.this指针存在位置
首先看下列的例子,我们平常使用实例对象的操作。
#include <iostream>
class Simple
{
private:
int m_id;
public:
Simple(int id)
: m_id{ id }
{
}
void setID(int id) { m_id = id; }
int getID() { return m_id; }
};
int main()
{
Simple simple{ 1 };//实例化对象
simple.setID(2);//调用对象的方法赋值
std::cout << simple.getID() << '\n';
return 0;
}
但是通过对象调用方法为什么会调用到正确的方法呢?若是一个类创建了多个对象,这些对象怎么调用成员函数呢?
调用成员函数时我们使用的是以下语句
simple.setID(2);
但是编译器得到的语句是翻译成下列语句的
setID(&simple, 2);
每个成员函数在被调用时都会传入调用对象的地址,因为每个对象都有着不同的地址。
当编译器编译普通成员函数时,它会隐式地向名为" this "的函数添加一个新形参。this指针是一个隐藏的const指针,保存调用成员函数的对象的地址。
因此成员函数表述可以被编译器理解为
void setID(Simple* const this, int id) { this->m_id = id; }
使用this->成员变量可以对成员变量进行赋值并更新
class Something
{
private:
int data;
public:
Something(int data)
{
this->data = data; // this->data是成员变量, data 是传入参数
}
void showdata()
{
std::cout << data << std::endl;
}
};
int main()
{
Something yang(6);
yang.showdata();
return 0;
}
在使用时我们一般写成m_加上成员变量的名字,防止与传入参数重名。
3 this指针返回一个对象
我们在进行下列计算时通常会使用分布计算
class Calc
{
private:
int m_value{ 0 };
public:
void add(int value) { m_value += value; }
void sub(int value) { m_value -= value; }
void mult(int value) { m_value *= value; }
int getValue() { return m_value; }
};
int main()
{
Calc calc{};
calc.add(5); // returns void
calc.sub(3); // returns void
calc.mult(4); // returns void
std::cout << calc.getValue() << '\n';
return 0;
}
但是当我们将返回值设置为对象时就可以简化计算
class Calc
{
private:
int m_value{};
public:
Calc& add(int value) { m_value += value; return *this; }//计算之后更新m_value的值并返回对象指针
Calc& sub(int value) { m_value -= value; return *this; }
Calc& mult(int value) { m_value *= value; return *this; }
int getValue() { return m_value; }
};
int main()
{
Calc calc{};
calc.add(5).sub(3).mult(4);
std::cout << calc.getValue() << '\n';
return 0;
}
通过返回对象指针一直调用便可以简化代码
“this”指针是隐式添加到任何非静态成员函数的隐藏形参。大多数情况下,您不需要直接访问它,但如果需要,您可以这样做。值得注意的是," this "是一个const指针——你可以改变它所指向的基础对象的值,但你不能让它指向其他东西!
文章参考https://www.learncpp.com/cpp-tutorial/the-hidden-this-pointer/