C++ this指针

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值