1?? 为什么会使用this?
在类中如果有多个成员函数,我们如果创建多个变量进行调用。编译器无法区分函数体中不同的对象。所以c++引入this来解决这个问题。即c++为每个静态成员增加了this隐藏指针,用该指针指向函数运行时该函数的对象。但是这一步是编译器进行的用户不需要去管,这也是this对于用户的好地方。 我们通过以下实例来理解:
class Date
{
public:
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1.Init(2022, 5, 11);
Date d2;
d2.Init(2022, 5, 12);
d1.Print();
d2.Print();
return 0;
}
注意:由于这块是编译器执行所以会报错
2??this有哪些特性?
1.this指针的类型:类型 const。 2只能在“成员函数”的内部使用。* (就如底下的成员函数存在于类中。) 3.this指针本质上就是成员函数的形参。 (看上图你就明白了,当对象调用成员函数时,将对象的地址作为实参传递给this形参,所以对象中部存储this指针) 4.this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。 注意:在cpp中this指针本身不能修改,因为他是const修饰的。this指向的对象可以背修改。
class Date
{
public:
void Print(Date* const this)
{
cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
}
void Print()
{
cout << this << endl;
cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
}
void Init(Date* const this, int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
void Init(int year, int month, int day)
{
cout << this << endl;
this->_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
Date d2;
Date d3;
d1.Init(&d1, 2022, 5, 15);
d2.Init(&d2, 2022, 5, 20);
cout <<"d1:"<<&d1<< endl;
cout << "d2:" << &d2 << endl;
d1.Init(2022, 5, 15);
d2.Init(2022, 5, 20);
d1.Print(&d1);
d2.Print(&d2);
d1.Print();
d2.Print();
Date* p = &d1;
p->Print(p);
p->Print();
return 0;
}
以上内容我们通过上述代码进行验证。 总结:该部分细节太多现对复杂些。
|