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;
}