文章目录
- 概述
- this指针的引出
- this指针的特性
- 将this指针用于多个对象的比较
- this指针可以为空吗?
概述
本篇博客主要讲解C++类和对象模块中的this指针的知识,将会深入探究this指针的使用细节即使用时需要注意的点,并且简单讲解一下底层的实现原理。
this指针的引出
我们首先定义一个日期类data
class Date
{
private:
int _year; //年
int _month; //月
int _day; //日
int a;
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month
_day = day;
}
void print()
{
std::cout << _year << "-" << _month << "-" << day << endl;
}
Date cp_year(const Date& x)
{
//如何将当前类的年份数据和其他类进行比较?
if(x._year>????)
reutnr x;
else
return ???;
//???处应该填写什么
}
};
int main()
{
Date d1,d2;
d1.Init(2022,1,2);
d2.Init(2023,3,24);
d1.print();
d2.print();
return 0;
}
在上面使用日期类的时候,就会有一些问题:
Date类中有
Init
与Init
函数时,该函数时如何知道应该设置d1对象时,而不是设置d2对象呢?
'cp_year’如果是当前类的年份更大,应该返回什么东西呢?
这里就要用到this指针了,c++通过引入this指针解决这些问题。
c++编译器给每个**”非静态的成员函数“增加了一个隐藏的指针参数**,让该指针去指向当前对象(函数运行时调用函数的对象),在函数体中所有"成员变量"的操作,都是通过该指针去访问的。只不过所有操作对用户都是”透明“的(不可见的),都是通过该指针去访问,即用户不需要传递该指针,编译器自动完成。
注意:
- 编译器同时也静止用户在函数声明中加上该指针,这是语法规定。
像这样,编译器会报错- this指针在运行时会存在于对象内部吗?
不存在于对象内部,this指针是一个形参,所以this指针是跟普通参数一样存在于函数调用的栈帧里面的。
this指针的特性
- this指针的类型: 类类型const指针,例如上面的类其this指针类型为(Date * const this),即成员函数中,不能给this指针赋值。(不能改变this指针的指向)
- 只能在成员函数内部使用
- this指针本质上是成员函数的形参,当对象调用成员函数时,编译器将隐式地将对象地址作为实参传递给this形参,所以对象中不存储this指针
- vs上对this指针的传递做出了优化,由于其经常要使用,vs编译器将this指针通过寄存器自动传递,从而可以提高访问效率,如下图所示:
另外,通过过this指针的了解,我们可以知道编译器在处理成员函数时会对其加上this指针,例如:
//类成员函数的print()函数将会被编译器隐式处理成如下形式:
void print(Date* const this)
{
std::cout << this->_year << "-" << this->_month << "-" << this->day << endl;
}
//隐式处理过程用户不可见
//并且调用过程
//d1.print()也相当于隐式地将d1的地址作为实参传递给了this指针
print(&d1);
将this指针用于多个对象的比较
当对this指针有了了解之后,我们就可以涌起去完善刚才无法完成的
cp_year
函数了,如下:
Date cp_year(const Date& x)
{
//注意,this是对象的指针,要使用其中的数据需要对其进行解引用操作
if (x._year > (*this)._year)
return x;
else
return *this ;
}
//接着就可以用这个函数来进行比较年份
Date old = d1.cp_year(d2);
old.print();
this指针可以为空吗?
看下面一个代码:
Date* p = nullptr;
p->print();
return 0;
大家可以先想一想,这段代码最后能够正常运行吗?还是会编译报错,又或者是运行时崩溃?
答案是:运行错误
为什么呢?
这是由于编译器并不禁止传递空指针给this形参,但是当
print()
函数要打印数据时会对this指针解引用(this->_year
),而对空指针解引用是会产生错误的,所以会发生运行崩溃。
以上就是关于this指针的全部内容啦!如果小伙伴们有哪里没有理解,或者发现博主的错误以及还有哪里没有写到位的话,欢迎大家在评论区指出!