C++ this指针
幻荼 人气:0简介
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参
数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成
特性
1. this指针的类型:类类型* const
2. 只能在“成员函数”的内部使用
3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this
形参。所以对象中不存储this指针。
4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
举例
class Data { public: void Printf() { cout << _year <<" "<<" "<< _month <<" "<< _day << endl; } void Init(int year=2022,int month=5,int day=25) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Data d1,d2; d1.Init(2022,1,1); d1.Printf(); d2.Init(2022,2,2); d2.Printf(); return 0; }
这是一个简单的日期类,那么这里有一个问题,我们在使用打印函数Printf和初始化函数Init的时候,d1和d2调用的是同一个函数,那么编译器是怎么知道我是应该设置/打印d1还是d2呢?
这其实就使用了this指针
那么具体编译器是怎么做的呢?
void Printf(const* this)//编译器实际上处理的 { cout << this->_year << " " << this->_month << " " << this->_day << endl; } void Printf()//我们看到的 { cout << _year <<" "<<" "<< _month <<" "<< _day << endl; }
void Init(const* this,int year=2022,int month=5,int day=25)//编译器处理的 { this->_year = year; this->_month = month; this->_day = day; } void Init(int year = 2022, int month = 5, int day = 25)//我们看到的 { _year = year; _month = month; _day = day; }
d1.Init(2022,1,1);//我们看到的 d1.Init(&d1,2022, 1, 1);//编译器实际上处理的
实际上编辑器取了d1和d2函数的地址,然后传递给了const*this,这样编译器就能自动打印和初始化相应的结构了。
注意
我们不能自己在传参处加const*this和&,这是编译器自己做的,我们不能抢了编译器的活,即使做了,编译也不会通过,但是里面我们可以加
void Printf(const* this)//错误 { cout << _year <<" "<<" "<< _month <<" "<< _day << endl; } void Printf()//可以运行,但是编译器默认都会加this->,所以我们可以不用加,加了也没事 { cout <<this-> _year <<" "<<" "<< this->_month <<" "<< this->_day << endl; }
加载全部内容