一、this指针
首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。
this是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。
this指针的类型取决于使用this指针的成员函数类型以及对象类型。
注:this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。
this指针作用:
this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)
代码示例
#include<iostream>
using namespace std;
/**************
要求:
定义一个Array类
数据成员:len表示数组长度
成员函数:析构、构造、len的封装函数、信息输出函数printInfo
***************/
class Array
{
public:
Array(int len);//将参数定义的与数据成员相同
~Array();
void setLen(int len);
int getLen();
Array printInfo();
private:
int len;
};
Array::Array(int len)
{
this->len = len;
}
Array::~Array()
{
}
void Array::setLen(int len)
{
this->len = len;
}
int Array::getLen()
{
return len;
}
Array Array::printInfo()//返回类型是一个对象
{
cout<<"len="<<len<<endl;
return *this;//this本身是一个指针 ,加上*后就是一个对象
}
int main()
{
Array arr1(10);
arr1.printInfo();
arr1.printInfo().setLen(5);//因为printInfo()函数的返回值是*this,是一个对象,所以可以利用.继续访问该对象的成员函数
cout<<arr1.getLen()<<endl;
return 0;
}
运行结果:
根据运行结果,打印出len=10说明printInfo被正常调用了,我们用返回的*this去继续访问setLen()函数,打印出的len的长度依然为10,并没有改变arr1的值;因为在printInfo()函数中,返回的*this就变成了另外一个对象,这个对象是一个临时对象,并不是arr1,所以无法改变arr1中数据成员的值;如果想让他能够改变arr1中数据成员的值,则将返回类型改为引用,那么return *this返回的就是对象本身
修改之后的代码:
#include<iostream>
using namespace std;
/**************
要求:
定义一个Array类
数据成员:len表示数组长度
成员函数:析构、构造、len的封装函数、信息输出函数printInfo
***************/
class Array
{
public:
Array(int len);//将参数定义的与数据成员相同
~Array();
void setLen(int len);
int getLen();
Array& printInfo();
private:
int len;
};
Array::Array(int len)
{
this->len = len;
}
Array::~Array()
{
}
void Array::setLen(int len)
{
this->len = len;
}
int Array::getLen()
{
return len;
}
Array& Array::printInfo()//返回类型是一个引用
{
cout<<"len="<<len<<endl;
return *this;//this本身是一个指针 ,加上*后就是一个对象
}
int main()
{
Array arr1(10);
arr1.printInfo();
arr1.printInfo().setLen(5);//因为printInfo()函数的返回值是*this,是一个对象,所以可以利用.继续访问该对象的成员函数
cout<<arr1.getLen()<<endl;
return 0;
}
运行结果:
this指针的本质就是他所在对象的地址!
利用代码证明
#include<iostream>
using namespace std;
/**************
要求:
定义一个Array类
数据成员:len表示数组长度
成员函数:析构、构造、len的封装函数、信息输出函数printInfo
***************/
class Array
{
public:
Array(int len);//将参数定义的与数据成员相同
~Array();
void setLen(int len);
int getLen();
Array& printInfo();
private:
int len;
};
Array::Array(int len)
{
this->len = len;
}
Array::~Array()
{
}
void Array::setLen(int len)
{
this->len = len;
}
int Array::getLen()
{
return len;
}
Array& Array::printInfo()
{
cout<<this<<endl;
return *this;
}
int main()
{
Array arr1(10);
arr1.printInfo();//打印this指针的地址
cout<<&arr1<<endl;//打印arr1的地址
return 0;
}
运行结果:
根据运行结果,我们看到this指针的地址和arr1地址相同,说明了this指针的本质就是他所在对象的地址。
this指针有哪些特性?
- 类型:类类型*const
- this指针并不是类本身的一部分,不影响sizeof(类)的大小
- this指针作用域在类成员函数内部
- this指针是非静态成员函数的一个隐含指针形参,是编译器自己给的,不能由程序员手动添加。
部分参考博客: