1、C++ this 指针
类的成员函数可以访问类的数据,一般类成员和函数操作都是通过对象,每个对象都拥有一个指针:this
指针,通过this指针来访问自己的地址。this
指针并不是对象的一部分,this
指针所占的内存大小是不会反应在sizeof
操作符上的。this
指针的类型取决于使用this指针的成员函数类型以及对象类型。this
只能在成员函数中使用。全局函数,静态函数都不能使用 this
。this
在成员函数的开始执行前构造的,在成员的执行结束后清除。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; }