您现在的位置是:首页 >技术交流 >C++“this”指针的使用网站首页技术交流
C++“this”指针的使用
1.this指针的引出
先看一段代码:
class Date
{
public:
Date(int year=0,int month=0,int day=0)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << " "
<< _month << " "
<< _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date Day1(2023, 4, 27);
Date Day2(2023, 4, 28);
Day1.Print();
Day2.Print();
return 0;
}
Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置Day1对象,而不是设置Day2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
2.什么是“this指针”
2.1.this指针
this指针存在于类的成员函数中,指向被调用函数类实例的地址。
一个对象的this指针并不是对象本身的一部分,不会影响sizeof()的结果。
this指针的作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。换句话说就是,及时你没有用this指针,编译器在编译的时候也会自动加上this的,它是一个隐含形参,对各成员的访问 均通过this进行。
2.2this指针的特性
this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
只能在“成员函数”的内部使用this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
2.3 this的使用
this不能显示在成员函数的形参中,但可以在成员函数中使用。
在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this。
当参数与成员函数的变相名相同使,应该使用this->_year=year。
比如:
3.this指针的存放
this指针是一个成员函数的一个被隐藏的形参,所以他存放在栈中,随着函数栈帧的销毁而销毁。
来看一段汇编代码:
this指针传参传的是地址。
4.this指针传参可以为空吗
先看代码:
class Date
{
public:
Date(int year=0,int month=0,int day=0)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
void Print()
{
cout << _year << " "
<< _month << " "
<< _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date Day1(2023, 4, 27);
Date Day2(2023, 4, 28);
Date* Day3 = nullptr;
Day1.Print();
Day2.Print();
Day3->Print();
return 0;
}
结果:代码报错
因为this指针传参传的是空指针,函数成员内部对this指针进行调用,导致出现非法访问,使系统奔溃。但是如果this指针为空,但是函数成员内部没有对this指针进行调用,则不会出现非法访问,系统正常运行。比如: