c++this对象指针的作用

博客介绍了C++中成员变量和成员函数分开存储的特性,即类中函数代码只有一份,数据成员可有多份,各对象共用函数代码以节省内存。还阐述了this指针引入的背景,是为解决多对象共用函数代码时的调用区分问题,以及其能区分同名形参和成员变量的作用。

1.首先我们必须知道c++中成员变量和成员函数是分开存储的。

说白了就是:类中的函数代码只有一份,但是数据成员可以有多份,定义几个对象就有几组数据成员,但是他们都共用同一份函数代码,这也符合常理,要是每定义一个对象都要再复制一份代码,那么对内存的浪费是巨大的。c++对内存相当吝啬,当然不允许这种情况出现。

//下面的对象都是指的是 person p中的p,相当于person的一份模板。
class Person {
public:
	Person() {
	}
	1.//非静态成员变量占对象空间(这也是唯一的占用对象空间的量,就是他自己的数据成员)
	int mA;
	2.//静态成员变量不占对象空间
	static int mB; 
	3.//函数也不占对象空间,所有函数共享一个函数实例
	void func() {}
	4.//静态成员函数也不占对象空间
	static void sfunc() {}
};

2.this指针。

(1)引入背景:我们已经知道c++中成员变量和成员函数是分开存储的。
当有多个同类型的对象存在时,每个对象会共用同一份函数代码。那么函数如何去区分哪个对象调用的自己呢?我函数把结果返回给哪个对象哪? 没有方向可不行。
这时候c++就引入了this对象指针,而且我们不用自己定义,系统自带的指针,我们直接用就行。
this指针即为指向调用函数的对象的指针。
this指针是隐含每一个非静态成员函数内的一种指针,静态不行,静态就一份

(2)this指针的作用
(i)当形参和成员变量同名时,用this指针来区分哪个是形参,哪个是成员变量。
例:

//1.正常代码
class person{
	public:
		int age;
		person(int age){
			this->age=age;
		}
};
int main(){
	person p(18);
	cout<<p.age<<endl;
}

在这里插入图片描述

//2.不加this时
class person{
	public:
		int age;
		person(int age){
			age=age;
		}
};
int main(){
	person p(18);
	cout<<p.age<<endl;
}

在这里插入图片描述

(ii)在类的非静态成员函数中返回对象本身,可使用return *this
      return *this的使用格式也有限制。通常用在链式作用。
      (下面的代码很有趣,可以自己改改看看有什么不同的反应)。
class person{
	public:
		int age;
		person(int age){
			this->age=age;//this功能1,区分对象的数据成员和形参。
		}
		//注意点1:如果要使用this指针,必须把函数返回值类型改成类的类型,还必须改成引用返回 
		person &add(person p){
			this->age += p.age;
			return *this;
		}
};
int main(){
	person p1(18);
	person p2(18);
	p2.add(p1).add(p1).add(p1).add(p1);
	//使用引用返回时p2.add(p1)返回的就是p2更新后的值,如果不加&,返回的就是一个新对象,后面的一串add就是和每次返回的新对象起作用的,而不是和p2,下面会贴一个不使用的代码,自己体会区别。
	cout<<p2.age<<endl;
}

在这里插入图片描述

//不使用引用返回时的情况,
  class person{
	public:
		int age;
		person(int age){
			this->age=age;
		}
		//注意点1:如果要使用this指针,必须把函数返回值类型改成类的类型,还必须改成引用返回 
		person add(person p){
			this->age += p.age;
			return *this;
		}
};
int main(){
	person p1(10);
	person p2(10);
	p2.add(p1).add(p1).add(p1).add(p1);//add没有加引用,所以第一次add后返回的不是p2本体。
	cout<<p2.age<<endl;
}      
 

在这里插入图片描述

附实验程序:

#include <iostream>
using namespace std;
class sjx{
	public:
		int a,b;
		sjx(int a,int b){
			this->a=a;
			this->b=b;
		}
	sjx &add(sjx &s){
		this->a+=s.a;
		this->b+=s.b;
		return *this;
	}
};
int main(){
      sjx s1(1,2);
      sjx s2(3,4);
      s1.add(s2).add(s2);
	  cout<<s1.b<<endl;
      cout<<s1.a<<endl;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ad_m1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值