C++类中this指针的理解
1、this指针的概念
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。
2、this指针的使用
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
接下来我们通过一个例子来加深一下理解:
一个学生可以有多本书一样,而这些书都是属于这个同学的;同理,如果有很多个同学在一起,那么为了确定他们的书不要拿混淆了,最好的办法我想应该就是每个同学都在自己的书上写上名字,这样肯定就不会拿错了。
同理,一个对象的多个成员就可看作是这个对象所拥有的书;而在很多个对象中间,我们为了证明某个成员是自己的成员,而不是其他对象的成员,我们同样需要给这些成员取上名字。在C++中,我们利用this指针帮助对象做到这一点,this指针记录每个对象的内存地址,然后通过运算符->访问该对象的成员。
在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。
最后我们通过一组程序来认识一下this指针:
class Box
{
public:
Box(double l=2.0,double w=2.0,double h=2.0)//构造函数定义
{
cout<<"constuctor called"<<endl;
length=l;
width=w;
height=h;
}
double caculate()
{
return length * width * height;
}
int compare(Box box)
{
return this->caculate() > box.caculate();
}
private:
double length;
double width;
double height;
};
int main()
{
Box box1(2.5,3.0,2.0);
Box box2(4.0,1.0,9.5);
if(box1.compare(box2))
{
cout<<"box2 is smaller than box1"<<endl;
}
else
{
cout<<"box2 is equal or bigger than box1"<<endl;
}
return 0;
}
通过运行结果可以看出,类生成两个对象时调用了两次构造函数。