this指针
1.this指针普通用法
/**************************************************************/
示例要求:
定义一个Array类
数据成员:m_iLen表示数组长度
成员函数:
构造函数
析构函数
len的封装函数
信息输出函数printInfo
/**************************************************************/
/*Array.h*/
class Array
{
public:
Array(int len);
~Array();
void setLen(int len);
int getLen();
void printInfo();
private:
int len;
};
/*Array.cpp*/
#include<iostream>
#include"Array.h"
using namespace std;
Array::Array(int len)
{
this->len = len;
}
Array::~Array()
{
}
void Array::setLen(int len)
{
this->len = len;
}
int Array::getLen()
{
return len;
}
void Array::printInfo()
{
}
/*demo.cpp*/
#include<iostream>
#include"Array.h"
using namespace std;
int main()
{
Array arr1(10);
cout<<arr1.getLen()<<endl;
system("pause");
return 0;
}
运行结果:
2.this指针的特殊用法
/*Array.cpp*/
#include<iostream>
#include"Array.h"
using namespace std;
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表示一个地址,而*this表示一个对象
}
/*demo.cpp*/
#include<iostream>
#include"Array.h"
using namespace std;
int main()
{
Array arr1(10);
arr1.printInfo().setLen(5); /*为了体现this指针返回的价值*/
cout << "len="<<arr1.getLen() << endl;
system("pause");
return 0;
}
输出结果:
想一想:我们明明已经调用setLen()函数了呀,为什么结果还是10呢?
Array Array::printInfo()
{
cout << "len=" << len << endl;
return *this; //this表示一个地址,而*this表示一个对象,只是一个临时的对象
}
因为在上段代码中,我们返回的*this是一个临时的对象,并不是arr1,如果我们想要返回的是arr1怎么办呢?就要写成Array& Array::printInfo(),在Array后面加一个引用符号&。
Array& Array::printInfo()
{
cout << "len=" << len << endl;
return *this; //加了引用符号"&"后,返回的是arr1这个对象
}
再次输出结果:发现调用setLen()函数起作用了
改成下面这段代码运行结果也是完全一样的:
Array* Array::printInfo()
{
cout << "len=" << len << endl;
return this; //将引用符号"&"改成"*",效果和上面完全一样
}
int main()
{
Array arr1(10);
arr1.printInfo()->setLen(5); /*为了体现this指针返回的价值*/
cout << "len="<<arr1.getLen() << endl;
system("pause");
return 0;
}
有关this指针的总结:
1.this指针无需用户定义,是编译器自动产生的。
2.同一个类的两个对象的this指针指向不同位置的内存。
3.当成员函数的参数或临时变量与数据成员同名时,可以使用this指针区分同名的数据成员。
4.this指针也是指针类型,所以在32位编译器下也占用4个基本的内存单元,即sizeof(this)的结果为4。