C++ 中,this 指针是一个特殊的指针,它指向当前对象的地址。它是每个非静态成员函数的隐式参数,可以通过 this 指针访问对象的成员(属性和方法)。this 指针使得在对象的成员函数中能够明确访问当前对象的成员,同时也方便在编写链式调用等高级用法时提供灵活性。本文主要介绍C++ this 指针。

1、C++ this 指针

类的成员函数可以访问类的数据,一般类成员和函数操作都是通过对象,每个对象都拥有一个指针:this 指针,通过this指针来访问自己的地址。this 指针并不是对象的一部分,this 指针所占的内存大小是不会反应在sizeof操作符上的。this 指针的类型取决于使用this指针的成员函数类型以及对象类型。this只能在成员函数中使用。全局函数,静态函数都不能使用 thisthis在成员函数的开始执行前构造的,在成员的执行结束后清除。this 指针只有在成员函数中才有定义。this 指针指向调用成员函数的对象的地址。静态成员函数没有 this 指针,因为它不属于任何特定的对象。

2、C++ this 指针的使用

在类的非静态成员函数中返回类对象本身时,可以使用圆点运算符(*this).,箭头运算符this->,另外,也可以返回关于*this的引用。不能改变 this 指针的值,this 是常量指针。

例如,

#include<iostream>
#include<string>
using namespace std;
class Person
{
  int sno;
  string sname;
  int age;
  int grade;
public:
  Person(int s=0,string n="",int a=0,int g=0)
  {
    sno=s;
    sname=n;
    age=a;
    grade=g;
  }
  //使用this指针进行赋值
  void Setsname(int sn)   
  {
    this->sname=sn;
  }
  int  Setage(int a)
  {
    this->age=a;
    //使用this指针返回该对象的年龄
    return (*this).age; 
  }
  void print()
  {
    //显式this指针通过箭头操作符访问
    cout<<"sname = "<<this->sname<<endl;  
    //隐式使用this指针打印
    cout<<"sno   = "<<sno<<endl;
    //显式使用this指针通过远点操作符
    cout<<"age   = "<<(*this).age<<endl;
    cout<<"grade = "<<this->grade<<endl<<endl;
  }
};
int main()
{
  Person p(761,"张三",19,3);
  p.print();      //输出信息
  p.Setage(12);  //使用this指针修改年龄
  p.print();     //再次输出
  return 0;
}

3、this 指针的常见用法

1)访问成员变量和成员函数

#include<iostream>
#include<string>
using namespace std;

class Person {
  int sno;
  string sname;
  int age;
  int grade;

public:
  Person(int s = 0, string n = "", int a = 0, int g = 0)
    : sno(s), sname(n), age(a), grade(g) {}

  void Setsname(const string& sn) {  // 修改参数类型为 string
    sname = sn;  // 不需要显式使用 this 指针
  }

  int Setage(int a) {
    age = a;  // 不需要显式使用 this 指针
    return age;
  }

  void print() const {
    cout << "sname = " << sname << endl;
    cout << "sno   = " << sno << endl;
    cout << "age   = " << age << endl;
    cout << "grade = " << grade << endl << endl;
  }
};

int main() {
  Person p(761, "张三", 19, 3);
  p.print();      // 输出信息
  p.Setage(12);   // 修改年龄
  p.print();      // 再次输出
  return 0;
}

2)返回当前对象

#include<iostream>
using namespace std;

class MyClass {
public:
    int value;

    MyClass(int value) : value(value) {}

    // 设置值并返回当前对象的地址
    MyClass* setValue(int value) {
        this->value = value;
        return this;  // 返回当前对象的地址
    }

    // 显示当前值
    void show() {
        cout << "Value: " << value << endl;
    }
};

int main() {
    // 创建对象并通过链式调用修改值并显示
    MyClass obj(10);
    obj.setValue(20)->show();  // 链式调用

    // 创建另一个对象并进行链式调用
    MyClass obj2(30);
    obj2.setValue(40)->setValue(50)->show();  // 链式调用多个函数

    return 0;
}

3)常量对象与 this 指针

#include<iostream>
#include<string>
using namespace std;

#include <iostream>

class MyClass {
public:
    int value;
    
    MyClass(int value) : value(value) {}

    void show() const {
        std::cout << "Value: " << this->value << std::endl;
    }
};

int main() {
    // 创建 MyClass 对象并初始化 value
    MyClass obj(42);

    // 调用 show 函数,打印 value
    obj.show();  // 输出: Value: 42

    // 尝试修改 value 会在编译时出错,因为 show 是 const 函数
    // obj.value = 100;  // 错误:const 成员函数不能修改对象成员

    return 0;
}

推荐文档