为什么要用this指针,为什么是const类型的

本文详细解释了C++中this指针的概念及其用途。通过具体示例展示了this指针如何帮助成员函数识别调用对象,并正确操作相应数据成员。
部署运行你感兴趣的模型镜像

假设Point类有getX这样一个非static函数:double Point::getX();实际上,成员函数在编译以后也要变成非成员函数,这也正是this指针的作用,用来接受调用对象的地址。也就是说,编译以后形式如下,当然函数名会变化,这里仅仅是想说明道理:double getX(Point *const this);因为在某次调用整个过程this指向都不允许改变(原因很简单,如果改变的话就不是这个对象调用的了),所以this就应该声明成const指针。
另外,如果是常函数也就是下面的定义:double Point::getX()const;编译后会变成:double getX(const Point *const this);因为不允许改变this指向内容的所以需要const Point。 通过代码总体理解下:

  当定义了一个类的若干对象后,每个对象都有属于自己的数据成员,但是所有对象的成员函数代码却合用一份。那么成员函数是怎样辨别出当前调用自己的是哪个对象,从而对该对象的数据成员而不是对其他对象的数据成员进行处理呢?

例如:

#include <iostream.h>
class A
{
public:
    A(int x1)
    {
        x = x1;
    }
    void disp()
    {
        cout<<"x="<<x<<endl;
    }
private:
    int x;
};
main()
{
    A a(1), b(2);
    cout<<"a:";
    a.disp();
    cout<<"b:";
    b.disp();
    return 0;

}

结果:

a:x=1
b:x=2

       执行a.disp()时,成员函数怎样知道现在对象a在调用自己?其实,不论对象a还是对象b调用disp()时,都执行同一条语句cout<<"x="<<x<<endl;,为什么在输出的时候不会搞乱?原来C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象。每当调用一个成员函数时,系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下,this指针是隐含存在的,也可以将其显示的表示出来。

例如:

#include <iostream.h>
class A
{
public:
    A(int x1)
    {
        x = x1;
    }
    void disp()
    {
        cout<<"\nthis="<<this<<"  when x="<<this->x;
    }
private:
    int x;
};

int main()
{
    A a(1), b(2), c(3);
    a.disp();
    b.disp();
    c.disp();
    return 0;
}

输出结果:

this=0x0012FF7C  when x=1
this=0x0012FF78  when x=2
this=0x0012FF74  when x=3

例如:

#include <iostream.h>
class Sample
{
private:
    int x, y;
public:
    Sample(int i=0, int j=0)
    {
        x = i;
        y = j;
    }
    void copy(Sample &xy);
    void print()
    {
        cout<<x<<","<<y<<endl;
    }
};
void Sample::copy(Sample &xy)
{
    if (this!=&xy)
    {
        *this = xy;
    }
}
void main()
{
    Sample p1, p2(5,6);
    p1.copy(p2);
    p1.print();

}

输出结果:

5,6

说明:

1,this指针是一个const指针,不能再程序中修改它或给它赋值;

2,this指针是一个局部数据,它的作用域仅在一个对象的内部

您可能感兴趣的与本文相关的镜像

Langchain-Chatchat

Langchain-Chatchat

AI应用
Langchain

Langchain-Chatchat 是一个基于 ChatGLM 等大语言模型和 Langchain 应用框架实现的开源项目,旨在构建一个可以离线部署的本地知识库问答系统。它通过检索增强生成 (RAG) 的方法,让用户能够以自然语言与本地文件、数据库或搜索引擎进行交互,并支持多种大模型和向量数据库的集成,以及提供 WebUI 和 API 服务

在 C++ 中,`this` 指针是一个指向当前对象的指针,它在的成员函数内部可用。`this` 指针类型类型的常量指针(即 `类型 *const`),这意味着 `this` 指针的值(即它所指向的对象的地址)在成员函数内部不能被修改。这种特性使得 `this` 指针在本质上被视为指针常量。 ### `this` 指针的常量性 `this` 指针的常量性体现在它不能被重新赋值。例如,在的成员函数中,尝试修改 `this` 指针的指向会导致编译错误: ```cpp class MyClass { int value; public: void modifyThis() { MyClass obj; // this = &obj; // 错误!this 是常量指针,不能修改其指向的地址 this->value = 10; // 合法:可以修改成员变量 } }; ``` [^3] ### `this` 指针指针常量的比较 指针常量(如 `int *const p`)表示指针的地址不能被修改,但指针指向的内容可以修改。`this` 指针的特性与此似,其指向的对象地址不能被修改,但可以通过 `this` 指针访问和修改对象的成员变量。 例如,`this` 指针类型可以理解为 `类型 *const this`,即指向类型的常量指针。因此,`this` 指针不能被重新赋值,但可以通过它修改对象的成员变量: ```cpp class Notebook { public: std::string content = "TwoMoons"; void read(std::string content) { std::cout << content << std::endl; // 输出局部变量 content std::cout << this->content << std::endl; // 输出成员变量 content } }; ``` [^4] ### 常量成员函数与 `this` 指针 当一个成员函数被声明为常量函数时(即在函数声明后加上 `const`),`this` 指针类型会进一步被修饰为指向常量对象的指针(即 `const 类型 *const this`)。在这种情况下,常量成员函数不能修改的成员变量(除非成员变量被声明为 `mutable`)。 例如: ```cpp class Student { public: void fun(int age, int height) const { // this->age = age; // 错误!常量成员函数不能修改成员变量 // this->height = height; // 错误! } public: int age; int height; }; ``` [^5] ### 总结 `this` 指针被视为指针常量,因为其指向的对象地址在成员函数内部不能被修改。这种设计保证了成员函数不会意外修改当前对象的地址,同时允许通过 `this` 指针访问和修改对象的成员变量。在常量成员函数中,`this` 指针进一步被修饰为指向常量对象的指针,从而限制了对成员变量的修改。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值