c++远征之封装篇(this指针)

本文介绍了C++中this指针的基本概念及其应用场景,包括普通用法和特殊用法。通过具体的类实现示例,展示了如何利用this指针进行成员函数间的链式调用,并解释了在不同情况下this指针的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值